来自-赦免战俘 - 洛谷
代码:
#include <iostream>
#include <math.h> //利用pow()函数算次方
using namespace std;
int a[1500][1500]; //因为最大每边顶多有2^10=1024人,所以1500大小没问题,定义为全局变量是为了方便使用
//全局变量会初始化为0,0就0吧,当做0为还未赦免的
void ff(int x, int m, int n)
{ //x为正方形边长,m和n为开始横纵坐标
if (x == 1) //当发现只剩一人时,函数结束
{
return;
}
int i = 0;
int j = 0;
for ( i = m; i < m+x/2; i++) //由提议可以写出i与j(正方形横纵的范围)
{
for ( j = n; j < n+x/2; j++)
{
a[i][j] = 1; //注意这里,先把1当做赦免的,0当做未赦免的
}
}
ff(x/2,m,n+x/2); //右上角
ff(x/2,m+x/2,n); //左下角
ff(x/2,m+x/2,n+x/2); //右下角
}
int main()
{
int n;
cin >> n;
int num = pow(2, n); //算2的n次方
ff(num,0,0); //调用函数,此函数用来给二维数组填东西
for (int i = 0; i < num; i++)
{
for (int j = 0; j < num; j++) //遍历,输出数组
{
if (a[i][j] == 1) //因为题意中,0为赦免的,1为未赦免,而我之前将1当做赦免,0当做未赦免。所以要将0和1换回来
{
a[i][j] = 0;
}
else if (a[i][j] == 0)
{
a[i][j] = 1;
}
cout << a[i][j]<<" ";
}
cout << "\n";
}
return 0;
}