首页 > 其他 > 详细

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

时间:2019-03-16 19:15:56      阅读:229      评论:0      收藏:0      [点我收藏+]

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;
}

 

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

原文:https://www.cnblogs.com/wmj6/p/10543344.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!