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

题目描述

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

试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。 

输出

输出一个整数表示答案

题解:

  观察可以知道,分界线上的点在图案上是关于点(3,3)对称的,所以从这个点开始向四个方向搜索,

  因为上下方向是对称的,搜的时候会重复计算。左右方向同理,所以最后结果要除以4

答案:509

#include<iostream>
#include<queue>
#include<algorithm>
#include<set>
#include<string.h>
using namespace std;

int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int vis[10][10];
int ans = 0;
void dfs(int x, int y)
{
    if(x == 0 || y == 0 || x == 6 || y == 6)//搜索到边界位置
    {
        ans++;
        return ;
    }
    for(int i = 0; i < 4; i++)
    {
        int x1 = x + dir[i][0];
        int y1 = y + dir[i][1];
        
        int x2 = 6 - x1;//对称方向
        int y2 = 6 - y1;
        
        if(x1 >= 0 && y1 >= 0 && x1 <= 6 && y1 <= 6)
        {
            if(!vis[x1][y1])//点是对称的,判断一个即可
            {
                vis[x1][y1] = vis[x2][y2] = 1;
                dfs(x1,y1);
                vis[x1][y1] = vis[x2][y2] = 0;//回溯
            }
        }
    }
}
 
 
int main(){
    memset(vis, 0, sizeof(vis));
    vis[3][3] = 1;
    dfs(3,3);
    printf("%d\n",ans/4);//上下方向是对称的,搜的时候会重复计算,左右方向同理,所以最后结果要除以4
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/-citywall123/p/12325896.html
今日推荐