您的位置:首页 > 其它

棋盘覆盖问题

2017-03-21 20:35 274 查看
#include <bits/stdc++.h>

using namespace std;
const int maxn = 2000;
int graph[maxn][maxn];
int ans;
int px, py;//棋盘大小以及黑块的位置

void dfs(int x, int y, int len) {
if(len == 2) { ans++; return; }

ans++;//每次递归都会有三个角模拟成黑色凑出一个L,所以直接把结果+1
len /= 2;
//把棋盘划分为4个子块,分别递归求解
//左上
if (x <= px && px <= x + len - 1 && y <= py && py <= y + len - 1) {//子块中有黑块
dfs(x, y, len);
}
else {
graph[x + len - 1][y + len - 1] = 1;//模拟黑块
dfs(x, y, len);
}
//左下
if (x + len <= px && px <= x + len*2 - 1 && y <= py && py <= y + len - 1) {//子块中有黑块
dfs(x + len, y, len);
}
else {
graph[x + len*2 - 1][y + len - 1] = 1;
dfs(x + len, y, len);
}
//右上
if (x <= px && px <= x + len - 1 && y + len <= py && py <= y + len*2 - 1) {//子块中有黑块
dfs(x, y + len, len);
}
else {
graph[x + len - 1][y + len*2 - 1] = 1;
dfs(x, y + len, len);
}
//右下
if (x + len <= px && px <= x + len*2 - 1 && y + len <= py && py <= y + len*2 - 1) {//子块中有黑块
dfs(x + len, y + len, len);
}
else {
graph[x + len*2 - 1][y + len*2 - 1] = 1;
dfs(x + len, y + len, len);
}
}

int main()
{
int len;
cout << "请输入棋盘边长(别超过2^10): 2^";
cin >> len;
if (len >10) {
cout << "边长太大!" << endl;
return 0;
}
cout << "2^" << len << "*2^" << len << "的棋盘已经创建" << endl;
cout << "请输入特殊位置的坐标(原点为1,1):";
cin >> px >> py;
if( px > (1<<len) || py > (1<<len) || px <= 0 || py <= 0) {
cout << "输入不合法!" << endl;
return 0;
}

ans = 0;
memset(graph, 0, sizeof(graph));
graph[px][py] = 1;

dfs(1, 1, 1<<len);//以左上角的坐标以及边长来表示一个正方形,注意边长在计算时要-1

cout << ans << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: