[image]100 棋盘覆盖问题,求c语言数组递归的解答,和思路

Python011

[image]100 棋盘覆盖问题,求c语言数组递归的解答,和思路,第1张

棋盘覆盖问题

问题描述:在一个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编程,然后用图形界面做。