用分治的策略可以设计棋牌覆盖问题的一个简捷的解法。
当 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 1000
int 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;
}