头歌资源库(14)残缺棋盘

156 阅读2分钟

一、 问题描述

 二、算法思想  

首先,将2^k × 2^k的棋盘划分为四个相等大小的子棋盘,定义为左上、左下、右上和右下四个子棋盘。

然后,根据残缺格的坐标,确定其中一个子棋盘是不完整的,即残缺子棋盘。假设残缺子棋盘是左上子棋盘。

接下来,分以下三种情况进行处理:

  1. 当k=1时,即棋盘大小为2×2时,直接填充序号即可。
  2. 当残缺子棋盘的坐标位于左上子棋盘的右下角时,将左上子棋盘的右下角作为残缺格,其余三个子棋盘按照相同的规则进行处理。
  3. 当残缺子棋盘的坐标位于左上子棋盘的其他位置时,将左上子棋盘的右下角、右上子棋盘的左下角和左下子棋盘的右上角作为三个残缺格,其余三个子棋盘按照相同的规则进行处理。

递归地对每个子棋盘进行相同的处理,直到棋盘大小为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");
 }

执行结果 

结语   

想多了都是问题

做多了都是答案

!!!