蓝桥杯每日一题1.6 2017省赛A组4.方格分割[DFS]

题目描述

6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。  
 
试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。 

输出

输出一个整数表示答案 

https://blog.csdn.net/weixin_43914593/article/details/112257103

✬✬✬✬✬如何从分割方格来联想到DFS呢?✬✬✬✬✬

highlight:

1.由于旋转对称的属于同一种分割法,得到的结果要/4

2.由题意,这一条切割线必定经过图的中心点,那么我们一旦确定了半条到达边界的分割线,就能根据这半条对称画出另外半条。(所以就可以从中心的点往外搜)

3.在搜索过程中需要注意的是,我们搜索出的半条分割线不能同时经过关于中心对称的两个点,所以在标记时,需要将对称的点也标上。(vis[x][y]=true的同时vis[6-x][6-y]=true)

4.向右、向左、向上、向下,四个方向DFS即可。

int X[]={0,-1,1,0,0};

int Y[]={0,0,0,-1,1};

x+=X[i];

y+=Y[i];

mistakes:

1.在for循环里面进行递归

2.走完一步之后再来询问是否访问过这个点

for(int i = 1 ; i <= 4 ; i++){   //上下左右四个方向

        x += X[i]; y += Y[i];        //走一步

        if(!vis[x][y]){       // 若该点未访问则继续深搜

            vis[x][y] = true;  //  当前的点标注为已访问

            vis[6 - x][6 - y] = true;

            dfs(x, y);         // 继续深搜

            vis[6 - x][6 - y] = false;

            vis[x][y] = false;

        }

        x -= X[i]; y -= Y[i];

    }

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 110000;

int X[]={0,-1,1,0,0};
int Y[]={0,0,0,-1,1};

bool vis[10][10];
int ans=0;

void dfs(int x,int y)
{
    if(x==0||x==6||y==0||y==6)
    {
        ans++;
        return ;
    }
    for(int i=1;i<=4;i++)
    {
        x+=X[i];
        y+=Y[i];
        if(!vis[x][y])
        {
            vis[x][y]=true;
            vis[6-x][6-y]=true;
            dfs(x,y);
            vis[6-x][6-y]=false;
            vis[x][y]=false;
        }
        x-=X[i];
        y-=Y[i];
    }
}

int main()
{
    vis[3][3]=true;
    dfs(3,3);
    cout<<ans/4;
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_43660826/article/details/112982567
今日推荐