zcmu-1931(dfs方格切割)
1931: wjw的剪紙
Time Limit:?4 Sec??Memory Limit:?128 MB
Submit:?26??Solved:?4
[Submit][Status][Web Board]
Description
ly最近要生日了,wjw決定送一份禮物給這個傻孩子,考慮了一下禮物,發現貴的買不起,遠的不想去,麻煩的不想做...最后wjw決定剪一張好看的圖案給ly當作禮物,畢竟禮輕情意重嘛,情誼重就行了!
現在wjw手里有一張正方形的彩紙,這張彩紙的邊長是n,由n*n個小正方形組成,現在wjw沿著小正方形的邊把這張彩紙剪成兩部分,為了美觀,他決定剪成形狀完全相同的兩部分...這時,wjw突發奇想,想知道到底能剪出多少種不同的圖案?但是wjw的智商不支持他回答自己的問題,于是他只能求助你,請你告訴他答案是多少.
//比如6*6的彩紙,以下是兩種剪法
?
?
Input
每組數據包含多組測試數據,每行一個正整數n(4<=n<=10)
?
Output
每行一個正整數表示答案
Sample Input
4
Sample Output
11
解析:可以發現,1---奇數邊的肯定不能平分面積,所以答案為 1;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2---偶數邊(以6*6為例)我們可以發現,分成兩個形狀相同,面積相同的都是以中心點(3,3)中心對稱的
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?所以,我們從中心點出發,dfs到邊界,有多少種說明有多少剪法,但是你會發現,答案不對,因為我們重復了,因為從中心到邊界,我們是往四個方向的,而且每一個方向都是可以以(3,3)中心對稱,所以會重復了,答案就是ans/4;
******注意:這里10*10是很大的,要跑很久,所以在提交時直接n==10,puts(“答案”),不然就會超時(畢竟我是跑了3? 4分鐘才出來答案)
#include<bits/stdc++.h> using namespace std; /*const int N = 10; long long ans = 0; int mpt[N+1][N+1]; int dir[4][2] = {0,1,1,0,0,-1,-1,0}; void dfs(int x,int y) {if(x == 0 || y == 0 || x == N || y == N){int i,j;ans ++;return;}for(int i = 0 ; i < 4 ; i ++){int tx = x + dir[i][0];int ty = y + dir[i][1];if(mpt[tx][ty])continue;mpt[tx][ty] = 1;mpt[N-tx][N-ty] = 1;dfs(tx,ty);mpt[tx][ty] = 0;mpt[N-tx][N-ty] = 0;} }*/ int main() {int n;while(~scanf("%d",&n)){if(n==5||n==7||n==9)puts("0");else if(n==4)puts("11");else if(n==6)puts("509");else if(n==8)puts("184525");else {puts("562070107");/*ans=0;mpt[N/2][N/2] = 1;dfs(N/2,N/2);printf("%lld\n",ans/4);*/} }return 0; }?
總結
以上是生活随笔為你收集整理的zcmu-1931(dfs方格切割)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么需要动态内存分配?
- 下一篇: zcmu-1934(卡特兰数大数取模(逆