P5461 赦免战俘


题目传送门

#include 

using namespace std;
const int N = 1100;
int a[N][N];

/**递归经典题
1、默认二维数组全是0,可以理解为默认都被赦免,如果找到不被赦免的,需要标识为1.
2、看到2^n之类的题,一般是采用递归方法。
3、递归肯定要有出口,出口的判定是极限值,就是只有一个单元时,怎么处理。本题就是n=0,表示区域只有一个人,无法继续分割,此时此人需要不被赦免。
4、左上角被赦免,其它三个小矩阵,也是一样的逻辑,所以可以重复递归使用cal.
5、递归的参数,就是左上角的开始坐标x,y,和边长2^n
6、其它三个小矩阵,需要计算出左上角的坐标值,这个需要使用画图通过数学来推导出来。
7、2^n用C++描述,就是 1<> n;
    //开始计算最大的矩阵
    cal(0, 0, n);
    //输出
    for (int i = 0; i < (1 << n); i++)
        for (int j = 0; j < (1 << n); j++)
            //这个换行符有点意思
            printf("%d%c", a[i][j], j == (1 << n) - 1 ? '\n' : ' ');
    return 0;
}