棋盘覆盖问题
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; }
相关文章推荐