思路:这是算法设计与分析课程中一个比较重要的算法,分治法解决。
代码如下:
#include<iostream>
#include<stdio.h>
using namespace std;
const int maxx=1e3+100;
int a[maxx][maxx];
inline void dfs(int n,int k)
{
if(n == 2)//小到一定程度就可以直接解决
{
a[k][0] = k+1;
a[k][1] = k+2;
a[k+1][0] = k+2;
a[k+1][1] = k+1;
}
else
{
dfs(n/2,k);
dfs(n/2,k+n/2);
for(int i = k; i < k+n/2; i++)
{
for(int j = n/2; j < n; j++) a[i][j] = a[i+n/2][j-n/2];
}
for(int i = k+n/2; i < k+n; i++)
{
for(int j = n/2; j < n; j++) a[i][j] = a[i-n/2][j-n/2];
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
dfs(n,0);
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++) printf("%d ",a[i][j]);
printf("\n");
}
}
return 0;
}
努力加油a啊,(o)/~