使用分治法解决棋盘覆盖问题
#include<iostream> using namespace std; const int SIZE=4; static int Board[SIZE][SIZE]={0}; static int title=1; int ChessBoard(int tr,int tc,int dr,int dc,int size) { if(size == 1) return 0;//这里虽然书上和网络上都没有返回值,但是在我这里的编译器都不通过 int t=title++; int s=size/2; if(dr<tr+s && dc<tc+s) { ChessBoard(tr,tc,dr,dc,s); } else { 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 { 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 { 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); } } void ChessPrint() { for(int i=0;i<SIZE;i++) { for(int j=0;j<SIZE;j++) { cout<<Board[i][j]; } cout<<endl; } } int main() { ChessBoard(0,0,1,1,SIZE); ChessPrint(); return 0; }
整个算法没有什么太难的地方,就是我一直分不清每个区域的号码
我将tr和tc搞反了
时间复杂度: