1. 程式人生 > >2017藍橋杯 省賽D題(方格分割)

2017藍橋杯 省賽D題(方格分割)

namespace 不同的 clu col lcm 多余 lib south lis

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題(方格分割)