棋盘覆盖问题
问题描述:在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
代码:#include<stdio.h>
int tile=0//整型变量,记录L型骨牌的数量 int Matrix[100][100]//定义数据结构
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{//tr和tc分别是棋盘左上角方格的行号、列号;dr和dc分别是特殊方格的行号、列号 if(size==1) return int t=tile++//L型骨牌号,初值为0 int s=size/2//分割棋盘
if(dr<tr+s&&dc<tc+s)//用L型骨牌号覆盖左上角子棋盘 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)//用L型骨牌号覆盖右上角子棋盘 ChessBoard(tr,tc,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)//用L型骨牌号覆盖左下角子棋盘 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)//用L型骨牌号覆盖右上角子棋盘 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) }
}
int main() { int size,r,c,row,col //memset(Matrix,0,sizeof(Matrix)) for(int i=0i<=100i++)//初始化 为零 { for(int j=0j<=100j++) { Matrix[i][j]=0 } } scanf("%d",&size)//输入棋盘大小 scanf("%d%d",&row,&col)//输入特殊方格位置 ChessBoard(0,0,row,col,size) for (r = 0r <sizer++)//输出棋盘覆盖结果 { for (c = 0c <sizec++) { printf("%2d ",Matrix[r][c]) } printf("\n") } return 0 }
输出结果:
通过字符控制是很难做出来的,而且毫不值得,你基本需要控制光标到特定位置进行重绘,这需要操作系统支持,而这种支持似乎越来越少了,已经没有啥API可以让你直接做了。
这种东西建议学习windows编程,然后用图形界面做。