这道题乍一看,特别没有头绪,心想这扭来扭去的咋算啊,后来通过讨论区get了思路,我们只需要把整个图不断分割就可以了,从Hn到Hn-1状态。不过左下和右下都有翻转,废了点功夫。还有就是2的30次方很大,需要用long存储才能过所有题目。
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int n;
long x, y;
while(cin >> n >> x >> y) {
long nowa = pow(2, n) / 2;
long result = 1;
for(int i = 0; i < n; i++) {
if(x > nowa && y > nowa) { //youshang
x -= nowa;
y -= nowa;
result += 2 * nowa * nowa;
} else if(y > nowa) { //zuoshang
y -= nowa;
result += nowa * nowa;
} else if(x > nowa) { //youxia
x = 2 * nowa - x + 1;
y = nowa - y + 1;
swap(x, y);
result += 3 * nowa * nowa;
} else { //zuoxia
swap(x, y);
}
//cout <<x <<' '<< y<< ' '<< result << endl;
nowa /= 2;
}
cout << result << endl;
}
return 0;
}