原题链接
赦免战俘 - 洛谷https://www.luogu.com.cn/problem/P5461
题解
本题是洛谷月赛的一道普及/提高-,同样出自题单入门6函数与结构体,大概看了一下题目是能感觉出来这是一道分治递归题的(不过我不会写),故拜读了一下洛谷大佬们的题解,全是我看不懂的分治递归,决定找规律来解决本题。
以输入样例3为例,输出结果如下:
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1
认真观察可以找到本规律:
这是一个平平无奇的矩阵
注意我标的红色指针:
(可恶啊图糊了)
细心的同学会发现,被红色指针所指的数字,当其值为1时,它的下方和右方数字值不同;当其值为0时,它的下方和右方数字值相同。
代码(嗯?还需要代码吗)
#include<bits/stdc++.h>
using namespace std;
int n,length;
bool a[2000][2000];
bool judge(int x,int y)
{
return a[x+1][y]==a[x][y+1];
}
int main()
{
cin>>n;
length=pow(2,n);
for(int i=1;i<=length;i++)
for(int j=1;j<=length;j++)
a[i][j]=0;
for(int i=1;i<=length;i++)
a[length][i]=1;
for(int i=1;i<=length;i++)
a[i][length]=1;
for(int i=length-1;i>=1;i--)
for(int j=length-1;j>=1;j--)
a[i][j]=!judge(i,j);
for(int i=1;i<=length;i++)
{
for(int j=1;j<=length;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
(假装这是一条分割线)
咨询大佬,然后苦心研究其代码之后
关于dfs、分治、递归写法的代码!
#include<bits/stdc++.h>
using namespace std;
bool g[2000][2000];
void dfs(int n,int x,int y)
{
if(n==1) return;//如果段长度为1就不用再进行分治了,如果不加这个就会死循环...
for(int i=x;i<=x+n/2-1;i++)
for(int j=y;j<=y+n/2-1;j++)
g[i][j]=0;
dfs(n/2,x+n/2,y);
dfs(n/2,x+n/2,y+n/2);
dfs(n/2,x,y+n/2);
}
int main()
{
int n;
cin>>n;
n=pow(2,n);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)g[i][j]=1;
dfs(n,1,1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<g[i][j]<<" ";
cout<<endl;
}
return 0;
}