填充方格

来源:互联网 发布:app数据采集工具 编辑:程序博客网 时间:2024/04/27 12:29
 设一个n*n棋盘,n=2^k,用L 型条块覆盖棋盘中除一个指定方格外的所有方格,每个L型条块可恰好覆盖3 个方格。例:假设n=8,指定左上角不能被覆盖,棋盘的一种覆盖方式如下。

运用了递归回溯的思想

#include "stdio.h"#define N 8int a[N][N]; int chessBoard(int tr,int tc,int dr,int dc,int s,int t){if(s==0)return 0;if(dr<tr+s && dc<tc+s)//左上角chessBoard(tr,tc,dr,dc,s/2,t+1);else{a[tr+s-1][tc+s-1]=t;chessBoard(tr,tc,tr+s-1,tc+s-1,s/2,t+1);output();}if(dr<tr+s && dc>tc+s-1)//左下角chessBoard(tr,tc+s,dr,dc,s/2,t+1+s*s);else{a[tr+s-1][tc+s]=t;chessBoard(tr,tc+s,tr+s-1,tc+s,s/2,t+1+s*s);output();}if(dr>tr+s-1 && dc<tc+s)//右上角chessBoard(tr+s,tc,dr,dc,s/2,t+1+2*s*s);else{a[tr+s][tc+s-1]=t;chessBoard(tr+s,tc,tr+s,tc+s-1,s/2,t+1+2*s*s);output();}if(dr>tr+s-1 && dc>tc+s-1)//右下角chessBoard(tr+s,tc+s,dr,dc,s/2,t+1+3*s*s);else{a[tr+s][tc+s]=t;chessBoard(tr+s,tc+s,tr+s,tc+s,s/2,t+1+3*s*s);output();}}int output(){int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",a[j][i]);putchar('\n');}putchar('\n');return 0;}int main(){int i,j;int dr,dc,tr,tc,s;int t=1;s=N;dr=3;dc=0;tr=tc=0;a[6][6]=0;chessBoard(tr,tc,dr,dc,s/2,t);output();return 0;}


0 0