残缺棋盘(4.3.3_【例14】)
2011-10-21 22:24
155 查看
二分法,不相似情况。
解残缺棋盘
解残缺棋盘
#include<iostream> using namespace std; int Amount=0,Board[100][100]; void OutputBoard(int size) { for(int i=0;i<size;i++) { for(int j=0;j<size;j++) cout<<Board[i][j]<<"\t"; cout<<"\n"; } } /******************************************************* * tr 子棋盘左上角方格所在的行 * tc 子棋盘左上角方格所在的列 * dr 残缺方格所在的行 * dc 残缺方格所在的列 * size 棋盘的行数或列数 *********************************************************/ void Cover(int tr,int tc,int dr,int dc,int size) { int s,t; if(size<2) return; Amount++; t=Amount; s=size/2; if(dr<tr+s&&dc<tc+s) //残缺方格在左上棋盘 { Cover(tr,tc,dr,dc,s); Board[tr+s-1][tc+s]=t; Board[tr+s][tc+s-1]=t; Board[tr+s][tc+s]=t; Cover(tr,tc+s,tr+s-1,tc+s,s); Cover(tr+s,tc,tr+s,tc+s-1,s); Cover(tr+s,tc+s,tr+s,tc+s,s); } else if(dr<tr+s&&dc>=tc+s) //残缺方格位于右上方 { Cover(tr,tc+s,dr,dc,s); Board[tr+s-1][tc+s-1]=t; Board[tr+s][tc+s-1]=t; Board[tr+s][tc+s]=t; Cover(tr,tc,tr+s-1,tc+s-1,s); Cover(tr+s,tc,tr+s,tc+s-1,s); Cover(tr+s,tc+s,tr+s,tc+s,s); } else if(dr>=tr+s&&dc<tc+s) //残缺方格位于左下方 { Cover(tr+s,tc,dr,dc,s); Board[tr+s-1][tc+s-1]=t; Board[tr+s-1][tc+s]=t; Board[tr+s][tc+s]=t; Cover(tr,tc,tr+s-1,tc+s-1,s); Cover(tr,tc+s,tr+s-1,tc+s,s); Cover(tr+s,tc+s,tr+s,tc+s,s); } else if(dr>=tr+s&&dc>=tc+s) //残缺方格位于右下方 { Cover(tr+s,tc+s,dr,dc,s); Board[tr+s-1][tc+s-1]=t; Board[tr+s-1][tc+s]=t; Board[tr+s][tc+s-1]=t; Cover(tr,tc,tr+s-1,tc+s-1,s); Cover(tr,tc+s,tr+s-1,tc+s,s); Cover(tr+s,tc,tr+s,tc+s-1,s); } } void main() { int size=1,x,y,i,j,k; cout<<"Please input k="; cin>>k; for(i=1;i<=k;i++) size=size*2; cout<<"Please input incomplete pane:"; cin>>x>>y; Cover(0,0,x,y,size); OutputBoard(size); }