蓝桥杯2017初赛:方格分割 (dfs搜索)

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

  • Description

6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。
在这里插入图片描述
如图就是可行的分割法。

  • Input

  • Output

输出一个整数表示答案

分析

因为要分割成中心对称图形,所以图中所有的点的坐标,都关于中心点对称。直接从中心点dfs搜索,每次把原点和对称点标记即可。

  • AC代码
#include<bits/stdc++.h>
using namespace std;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};//移动方向,上下左右
int vis[7][7]={0};
int ans=0;//计数
bool ok(int x,int y)  //判断点是否在范围内
{
    if(x>=0&&x<=6&&y>=0&&y<=6)
        return 1;
    return 0;
}
void dfs(int x,int y)
{
    if(x==6||x==0||y==6||y==0)  //设置出口
    {
        ans++;
        return;
    }
    else
    {
        for(int i=0;i<4;i++)  //4个方向,依次遍历
        {
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(!vis[nx][ny]&&ok(nx,ny))
            {
                vis[nx][ny]=1;
                vis[6-nx][6-ny]=1;    //原点和中心对称点都标记
                dfs(nx,ny);

                vis[nx][ny]=0;   //若不成功,回溯
                vis[6-nx][6-ny]=0;
            }
        }
    }
}
int main()
{
    vis[3][3]=1;        //结果为中心对称图形,直接从中间点开始搜
    dfs(3,3);
    cout<<ans/4<<endl;  //旋转4个方向算相同情况,结果除以4
    return 0;
}








发布了14 篇原创文章 · 获赞 3 · 访问量 542

猜你喜欢

转载自blog.csdn.net/qq_44577309/article/details/104374791