一、 问题描述
二、算法思想
首先,将2^k × 2^k的棋盘划分为四个相等大小的子棋盘,定义为左上、左下、右上和右下四个子棋盘。
然后,根据残缺格的坐标,确定其中一个子棋盘是不完整的,即残缺子棋盘。假设残缺子棋盘是左上子棋盘。
接下来,分以下三种情况进行处理:
当k=1时,即棋盘大小为2×2时,直接填充序号即可。
当残缺子棋盘的坐标位于左上子棋盘的右下角时,将左上子棋盘的右下角作为残缺格,其余三个子棋盘按照相同的规则进行处理。
当残缺子棋盘的坐标位于左上子棋盘的其他位置时,将左上子棋盘的右下角、右上子棋盘的左下角和左下子棋盘的右上角作为三个残缺格,其余三个子棋盘按照相同的规则进行处理。
递归地对每个子棋盘进行相同的处理,直到棋盘大小为2×2时,再直接填充序号。
具体实现时,可以使用递归函数来处理,函数的输入参数为棋盘大小和残缺格的坐标,输出为填充好序号的棋盘。
三、代码实现
#include<stdio.h>
#include<math.h>
void TileBoard(int tr,int tc,int dr,int dc,int size);
void OutputBoard(int size);
int tile=1;
int Board[1025][1025];
int main()
{
int n,a,b;
scanf("%d",&n);
int sum;
sum=pow(2,n);
scanf("%d %d",&a,&b);
Board[n][n]=0;
TileBoard(0,0,a,b,sum);
OutputBoard(sum);
return 0;
}
void TileBoard(int tr,int tc,int dr,int dc,int size)
{
if(size==1) return;
int t=tile++,
s=size/2;
if(dr<tr+s&&dc<tc+s)
TileBoard(tr,tc,dr,dc,s);
else
{
Board[tr+s-1][tc+s-1]=t;
TileBoard(tr,tc,tr+s-1,tc+s-1,s);
}
if(dr<tr+s&&dc>=tc+s)
TileBoard(tr,tc+s,dr,dc,s);
else
{
Board[tr+s-1][tc+s]=t;
TileBoard(tr,tc+s,tr+s-1,tc+s,s);
}
if(dr>=tr+s&&dc<tc+s)
TileBoard(tr+s,tc,dr,dc,s);
else
{
Board[tr+s][tc+s-1]=t;
TileBoard(tr+s,tc,tr+s,tc+s-1,s);
}
if(dr>=tr+s&&dc>=tc+s)
TileBoard(tr+s,tc+s,dr,dc,s);
else
{
Board[tr+s][tc+s]=t;
TileBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
void OutputBoard(int size)
{
for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++){
printf("%-3d",Board[i][j]);
}
printf("\n");
}
printf("end");
}
执行结果
结语
想多了都是问题
做多了都是答案
!!!