棋牌覆盖问题

来源:互联网 发布:没有充电器 给mac充电 编辑:程序博客网 时间:2024/06/02 22:05

用分治的策略可以设计棋牌覆盖问题的一个简捷的解法。

当 K>0 时,将2^k X2^k 棋牌分割为4个小的棋牌, 特殊方法必位于4个较小的棋牌之一。内容来自算法设计———王晓东那本书上的思想。。。。

#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<cstring>using namespace std;#define MAX 1000int Board[MAX][MAX];int title;void ChessBoard(int tr, int tc, int dr, int dc, int size){     if(size==1)return;     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);     }}int main(){    int k, m, n;    while(cin>>k)    {      title =1;     cin>>m>>n;     memset(Board, 0, sizeof(Board));     Board[m][n]=-1;     ChessBoard(0, 0, m, n, k);     for(int i=0; i<k; i++)     {     for(int j=0; j<k; j++)     cout<<Board[i][j]<<' ';     cout<<endl;     }    }   system("pause");   return 0;}


原创粉丝点击