首页 > 编程语言 >0001-算法笔记分治法实现棋盘覆盖问题

0001-算法笔记分治法实现棋盘覆盖问题

时间:2023-03-24 15:05:41浏览次数:30  
标签:0001 int chessBoard 分治 tr 方格 棋盘 dr tc


今天上课老师讲了分治法,下课后自己把程序碼了一遍,还是存在一个疑问--为什么每个方格都会填充到,在下面将会解决并叙述。

        首先贴上程序:

#include <stdio.h>
 #include <stdlib.h>
 #include <memory.h>
 int tile = 0;
 int Board[100][100];

 /*    tr:棋盘左上角方格的行号
    tc:棋盘左上角方格的列号
    dr:特殊方格所在行号
    dt:特殊方格所在列号
*/
 void chessBoard(int tr, int tc, int dr, int dc, int size);


 int main()
 {
     int size,r,c,row,col;
     memset(Board,0,sizeof(Board));
     scanf("%d",&size);
     scanf("%d%d",&row,&col);
     chessBoard(0,0,row,col,size);


     for (r = 0; r < size; r++)
     {
         for (c = 0; c < size; c++)
         {
             printf("%2d ",Board[r][c]);
         }
         printf("\n");
     }


     return 0;
 }



void chessBoard(int tr, int tc, int dr, int dc, int size)
 {
     int s,t;
     if (1 == size) return;


     s = size/2;               //分割棋盘 
     t = ++ tile;              //L型骨牌号

     //覆盖左上角子棋盘
     if (dr < tr + s && dc < tc +s)
     {
         //特殊方格在此棋盘中chessBoard(tr,tc,dr,dc,s);
     }
     else
     {//此棋盘中无特殊方格        //用t号L型骨牌覆盖右下角
         Board[tr+s-1][tc+s-1] = t;
        //覆盖其余方格        chessBoard(tr,tc,tr+s-1,tc+s-1,s);
     }
     //覆盖右上角子棋盘
     if (dr < tr + s && dc >= tc + s )
     {//特殊方格在此棋盘中
         chessBoard(tr,tc+s,dr,dc,s);
     }
     else
     {//此棋盘中无特殊方格//用t号L型骨牌覆盖在左下角
         Board[tr+s-1][tc+s] = t;        //覆盖其余方格
         chessBoard(tr,tc+s,tr+s-1,tc+s,s);
     }

 //覆盖左下角子棋盘
     if (dr >= tr + s && dc < tc + s)
     {
        //特殊方格在此棋盘中 chessBoard(tr+s,tc,dr,dc,s);
     } 
     else
     {//此棋盘中无特殊方格//用t号L型骨牌覆盖在左下角
         Board[tr+s][tc+s-1] = t; //覆盖其余方格
         chessBoard(tr+s,tc,tr+s,tc+s-1,s);
     }


     if (dr >= tr + s && dc >= tc + s)
     {
         chessBoard(tr+s,tc+s,dr,dc,s);
     } 
     else
     {
         Board[tr+s][tc+s] = t;
         chessBoard(tr+s,tc+s,tr+s,tc+s,s);
     }


 }

实现结果如图示:



通过代码调试,我们可以看到,每次的填值都是将方格里的值填入,而不是只填特殊格的值。书中的这段代码在每次覆盖还有循环递归中也设计的很巧妙!和大家一起分享学习


标签:0001,int,chessBoard,分治,tr,方格,棋盘,dr,tc
From: https://blog.51cto.com/u_15955938/6147280

相关文章

  • 「分治」黑白棋子的移动
    本题为3月23日23上半学期集训每日一题中A题的题解题面题目描述有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形:○○○○○●●●●......
  • curl: (35) error:0A000126:SSL routines::unexpected eof while reading
    这个错误信息"curl:(35)error:0A000126:SSLroutines::unexpectedeofwhilereading"通常表示客户端(curl)和服务器之间的SSL/TLS握手存在问题。以下是一些可能的原因和......
  • 权值(点分治)
    264.权值-AcWing题库引:\(\color{Yellow}水何澹澹,山岛竦峙。\)Solution这是一棵无根树,所以据此使用点分治。点分治适合处理大规模的树上路径信息问题。我们先......
  • 分治策略
    分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这......
  • CDQ分治
    这是一个比较人类智慧的算法,尽管它大多数时候都不是出题人想要考察的算法,但是绝大部分时候出题人都没办法卡掉你然后愤然强制在线。在怎样的情况下才能使用cdq分治?一般......
  • [学习笔记] CDQ分治
    引入-分治分治,就是将讲原问题不断细分直到规模小到能够解决,然后一层层向上合并得到答案的过程。归并排序大致思想:把序列拆成左右两部分,分别归并排序,然后使用两个指针......
  • Tree Master (根号分治,离散化)
    题目大意:给出一个树,每次给出2个相同高度的点,然后依次向父亲走,问val[a]*val[b]这些值加起来是多少 思路:直接map映射关联容器,时间复杂度过大根号分治?于是......
  • 【洛谷】P2150 [NOI2015] 寿司晚宴(状压dp+根号分治)
    原题链接题意有序列\(2,3,4\cdotsn\),对于序列中的每一个数,它可以被放入两个集合中的任意一个,或者不选。最后需要满足两个集合间的数两两互质(集合内部的数不需要满足互......
  • svn E230001 Server SSL certificate verification failed certificate issued for a
    title:ServerSSLcertificateverificationfailedcertificateissuedforadifferenthostname,issuerisnottrusteddate:2023-03-1914:58:00categories:踩......
  • 分治算法总结(未完结)
    分治思想:将一个问题分解成若干个结构与原问题相同的子问题。(划分子问题+后处理)一、经典问题1.最大子段和思路:计算左边的最大子段和、右边的最大子段和以及跨越......