棋盘覆盖问题
问题描述:
问题分析:
将大棋盘分成四个小棋盘,做四次判断是否黑块在4个各自的小棋盘内,如果在,直接用原来的黑块位置递归求解,若不在,将靠近大棋盘中间的那块当做黑块,继续递归,注意每次递归开始都是从左上角的坐标开始,遇到棋盘边长为1,递归返回
代码示例:
1 //棋盘覆盖问题 2 #include<stdio.h> 3 #include<string.h> 4 #define max 1024 5 int n,i,def[max][max]; 6 int aa,bb; 7 void fenzhi(int a,int b,int aa,int bb,int len) //aa,bb为黑块坐标,a,b为棋盘的左上角,这里从1,1开始 8 { 9 if(len==1) return; 10 i++; 11 int temp=i; //i是个全局变量,递归回来会发生变化 12 int l=len/2; //必须把用l替换len/2去参加下层递归,第一个if else语句中的递归回来,len就发生了变化 13 if(aa<a+l&&bb<b+l) fenzhi(a,b,aa,bb,l); 14 else 15 { 16 def[a+l-1][b+l-1]=temp; 17 fenzhi(a,b,a+l-1,b+l-1,l); 18 } 19 20 if(aa>=a+l&&bb<b+l) fenzhi(a+l,b,aa,bb,l); 21 else 22 { 23 def[a+l][b+l-1]=temp; 24 fenzhi(a+l,b,a+l,b+l-1,l); 25 } 26 27 if(aa<a+l&&bb>=b+l) fenzhi(a,b+l,aa,bb,l); 28 else 29 { 30 def[a+l-1][b+l]=temp; 31 fenzhi(a,b+l,a+l-1,b+l,l); 32 } 33 34 if(aa>=a+l&&bb>=b+l) fenzhi(a+l,b+l,aa,bb,l); 35 else 36 { 37 def[a+l][b+l]=temp; 38 fenzhi(a+l,b+l,a+l,b+l,l); 39 } 40 } 41 42 int main() 43 { 44 printf("请输入棋盘边长和黑点坐标,下标均为1开始:\n"); 45 while(scanf("%d%d%d",&n,&aa,&bb)) 46 { 47 i=0; //此语句必不可少,清除上次作业残留 48 memset(def,0,sizeof(def));//同上 49 fenzhi(1,1,aa,bb,n); 50 for(int i=1;i<=n;i++) 51 { 52 for(int j=1;j<=n;j++) printf("%3d",def[i][j]); 53 printf("\n\n"); 54 } 55 printf("请输入棋盘边长和黑点坐标,下标均为1开始:\n"); 56 } 57 return 0; 58 } 59 //代码参考https://blog.csdn.net/qq705167895/article/details/84106219
运行结果: