一、 问题描述
二、算法思想
首先,将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");}
执行结果
结语
想多了都是问题
做多了都是答案
!!!