您的位置:首页 > 其它

2017年浙江中医药大学大学生程序设计竞赛(重现赛)-H剪纸

2017-12-21 14:35 309 查看
题目大意:给定n*n的正方形方格纸,要求沿着方格纸的线条将方格纸分成完全相等的两部分的剪纸方案数。
思路:应该从线条上考虑dfs,同时所搜当前点的对称点记为访问过,每次搜到边界就是一种方案数。考虑对称性,最后结果除以4.
ac代码:#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool vis[11][11];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1},n,cnt;
void dfs(int x,int y){
if(x==0||y==0||x==n||y==n){
cnt++;return;
}
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx>=0&&yy>=0&&xx<=n&&yy<=n&&!vis[xx][yy]&&!vis[n-xx][n-yy]){
vis[xx][yy]=vis[n-xx][n-yy]=1;
dfs(xx,yy);
vis[xx][yy]=vis[n-xx][n-yy]=0;
}
}
}
int main(){
int T;scanf("%d",&T);
while(T--){
scanf("%d",&n);
cnt=0;
if(n&1) puts("0");
else{
memset(vis,0,sizeof(vis));
vis[n/2][n/2]=1;
dfs(n/2,n/2);
printf("%d\n",cnt/4);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐