2017蓝桥杯 省赛D题(方格分割)

6x6的方格,沿着格子的边线剪开成两部分。
要求这两部分的形状完全相同。

如图:p1.png, p2.png, p3.png 就是可行的分割法。

这里写图片描述 这里写图片描述 这里写图片描述

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

请提交该整数,不要填写任何多余的内容或说明文字。

思路:从中间点搜索碰到边界答案就加1 然后值得注意的是每一次都要标记两个点 因为是对称搜索的 其次最后答案需要除4,因为题目中说要旋转对称的是同一种。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long int
using namespace std;
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
int ans;
bool vis[10][10];
void dfs(int x,int y){
    if(x==0||x==6||y==0||y==6){
        ans++;
        return ;
    }
    for(int i=0;i<4;i++){
        int xx=x+dir[i][0];
        int yy=y+dir[i][1];
        if(xx>=0&&xx<=6&&yy>=0&&yy<=6&&!vis[xx][yy]){
            vis[xx][yy]=1;
            vis[6-xx][6-yy]=1;
            dfs(xx,yy);
            vis[xx][yy]=0;
            vis[6-xx][6-yy]=0;
        }    
    }
}
int main(){
    ios::sync_with_stdio(false);
    ans=0;
    vis[3][3]=1;
    dfs(3,3);
    cout<<ans/4<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/wmj6/p/10543344.html