棋盘覆盖问题

来源:互联网 发布:php files 编辑:程序博客网 时间:2024/06/05 00:48
#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;}

1 0
原创粉丝点击