棋盘覆盖问题

问题描述:

 

 

 问题分析:

  将大棋盘分成四个小棋盘,做四次判断是否黑块在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

运行结果:

 

posted @ 2020-04-26 14:13  kakusan  阅读(267)  评论(0编辑  收藏  举报