[蓝桥杯2017初赛]方格分割[DFS]

题目链接:P1320 - [蓝桥杯2017初赛]方格分割 - New Online Judge (ecustacm.cn)

思路:

这个题用方格的角度去想很难想出全部的答案。
要换个角度,看方格线,假设左上角的坐标是(0,0),那么右下角就是(6,6)
进行dfs,走的时候中心对称点也要进行访问,一旦走到边界上,即(x == 0 || y == 0 || x == 6 || y == 6),就走出一条分割线,这就是一种分割方法。

需要注意的是,因为切割线一定也关于坐标(3,3)中心对称
所以我们只需要走半条切割线即可,并且这条切割线一定满足划分两个相同的方格的要求
并且我们在dfs的过程中,要把当前走过点关于中心店对称的点也标记一下
因为我们在走的过程中不可能原路返回,如果我们走了一个点x和它的中心对称点x',那么这条路径一定不符合(容易验证)
如果我们切割一条完整的切割线,这条线可能不满足要求,并且我们也不好去验证

最终的结果要除以4,例如 我们从(3,3)点出发一直向右到边界 , 或一直向左,或一直向上,或一直向下
剪出来的图形是同一个

code

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

bool st[10][10];
int res;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};

void dfs(int x, int y)
{
    if(!x || !y || x == 6 || y == 6)
    {
        res ++ ;
        return ;
    }
    for(int i = 0; i < 4; i ++ )
    {
        int cx = x + dx[i], cy = y + dy[i];
        if(!st[cx][cy])
        {
            int rx = 6 - cx, ry = 6 - cy;
            st[cx][cy] = true;  st[rx][ry] = true;
            dfs(cx, cy);
            st[cx][cy] = false;  st[rx][ry] = false;            
        }

    }
}

int main()
{
    st[3][3] = 1;
    dfs(3, 3);
    cout << (res>>2) << endl;
    return 0;
}





posted @ 2022-05-05 08:41  光風霽月  阅读(33)  评论(0编辑  收藏  举报