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

        首先贴上程序:

#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);
     }


 }

实现结果如图示:



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