分治算法——棋盘覆盖问题

it2023-02-18  86

整个题目还是分治的思想,由于棋盘是2^k*2^k的,所以我们可以把他平均分成4份,每一份再递归的调用覆盖函数,直到需要覆盖的边长为1,说明只有一个位置,并且该位置放置的是特殊方格。

传入的参数中,tr,tc是棋盘的坐标,dr,dc是已经特殊方格的坐标,size是棋盘的边长。

覆盖函数的思路就是,从宏观的角度思考,把棋盘分为左上右上,左下右下,如果方格在当前的方位,就递归的覆盖棋盘,如果方格不在当前方位,就把目前围绕整个棋盘中心点的四个方格的当前方位的方格填充,并当作下一次递归的特殊方格。

#include<vector> #include<iostream> using namespace std; vector<vector<int>>chess(4,vector<int>(4,-1));//规划一个8*8的棋盘 int number=1;//代表L型骨牌 void chessBoard(int tr,int tc,int dr,int dc,int size){ //cout<<"tr"<<tr<<"tc"<<tc<<"dr"<<dr<<"dc"<<dc<<endl; if(size==1){ return; } int s=size/2,temp=number++; if(dr<tr+s&&dc<tc+s)//特殊方块在左上角 chessBoard(tr,tc,dr,dc,s); else{ chess[tr+s-1][tc+s-1]=temp; 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{ chess[tr+s-1][tc+s]=temp; 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{ chess[tr+s][tc+s-1]=temp; 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{ chess[tr+s][tc+s]=temp; chessBoard(tr+s,tc+s,tr+s,tc+s,s); } return; } int main() { chess[0][1]=0;//0代表特殊方格 chessBoard(0,0,0,1,4); for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ cout<<chess[i][j]<<" "; } cout<<endl; } return 0; }

最新回复(0)