问题描述
完整代码
#include<iostream>
using namespace std;
#include<bits/stdc++.h>
#include<iomanip> //控制整数输出位数是两位对齐好看
#define max 1025
int k; //2^k棋盘
int x,y;//特殊方格所在位置
int board[max][max];
int tile=1;
void ChessBoard(int tr, int tc,int dr,int dc,int size)
{
if(size==1) return;
int t=tile++;
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; //用t号L型骨牌覆盖右上角
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; //用t号L型骨牌覆盖左上角
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);//将左上角作为特殊方格继续处理该象限
}
}
int main()
{
cout<<"请输入k值:";
cin>>k;
cout<<endl<<"请输入特殊方格坐标x和y:";
cin>>x>>y;
board[x][y]=0;
int i,j;
int n = pow(2,k);
ChessBoard(1,1,x,y,n);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
cout<<setw(2)<<board[i][j]<<" ";
cout<<endl;
}
return 0;
}
运行结果