• 棋盘覆盖问题


    问题描述:

     问题分析:

      将大棋盘分成四个小棋盘,做四次判断是否黑块在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开始:
    ");
    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("
    
    ");
    54         }
    55         printf("请输入棋盘边长和黑点坐标,下标均为1开始:
    ");
    56     }
    57     return 0;
    58 }
    59 //代码参考https://blog.csdn.net/qq705167895/article/details/84106219

    运行结果:

  • 相关阅读:
    [BZOJ2839:]集合计数
    [BZOJ2863:]愤怒的元首
    [BZOJ:3162]:独钓寒江雪
    PHP数据库基础(简单的)
    PHP数组创建和遍历(基础)
    中缀表达式转换为前、后缀表达式转化简单的技巧[转]
    PHP网页简单的计算机源代码
    JS确认取消按钮使用
    js(JavaScript)使用${pageContext.request.contextPath}报错
    易游验证怎么配置?易游验证怎么使用!!
  • 原文地址:https://www.cnblogs.com/bboykaku/p/12779197.html
Copyright © 2020-2023  润新知