编辑代码

#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
  
int num = 0;  
int Matrix[100][100];  
  
void chessBoard(int tr, int tc, int dr, int dc, int size);  
  
int main()  
{  
    clock_t start, end;  
    double cpu_time_used;  
    int size, r, c, row, col;  
  
    printf("请输入棋盘的行列号: ");  
    scanf("%d", &size);  
    printf("请输入特殊方格的行列号: ");  
    scanf("%d %d", &row, &col);  
  
    // 记录开始时间  
    start = clock();  
  
    chessBoard(0, 0, row, col, size);  
  
    // 记录结束时间  
    end = clock();  
  
    // 计算并输出运行时间  
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;  
    printf("程序运行时间: %f 秒\n", cpu_time_used);  
  
    // 输出棋盘  
    for (r = 0; r < size; r++)  
    {  
        for (c = 0; c < size; c++)  
        {  
            printf("%2d ", Matrix[r][c]);  
        }  
        printf("\n");  
    }  
  
    return 0;  
}  
  
void chessBoard(int tr, int tc, int dr, int dc, int size)
{
    if (size==1) 
    	return;
    int s = size/2;     //分割棋盘
    int t = ++num;      //L型骨牌号
    
    //覆盖左上角子棋盘
    if (dr < tr + s && dc < tc +s)                
    {
        //特殊方格在此棋盘中
        chessBoard(tr,tc,dr,dc,s);
    }
    else            //此棋盘中无特殊方格
    {
        //用t号L型骨牌覆盖右下角
        Matrix[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型骨牌覆盖左下角
        Matrix[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型骨牌覆盖右上角
        Matrix[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
    {
        //用t号L型骨牌覆盖左上角
        Matrix[tr+s][tc+s] = t;
        //覆盖其余方格
        chessBoard(tr+s,tc+s,tr+s,tc+s,s);
    }

}