您的位置:首页 > 编程语言 > C语言/C++

第七届省赛C语言A组7题-剪邮票

2018-03-28 15:40 218 查看
剪邮票

如【图1.jpg】, 有12张连在一起的12生肖的邮票。这里写图片描述

现在你要从中剪下5张来,要求必须是连着的。

(仅仅连接一个角不算相连)

比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

请你计算,一共有多少种不同的剪取方法。

请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。



思路:1.先遍历12中选5个的组合 792种

2.再判断这五个方块是否连通,用DFS。

一共116种。

代码:

#include<stdio.h>
#include<string.h>
int count=0;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int idx[3][4];
void dfs(int x)
{
int i,x1,y1;
x1=x/4;
y1=x%4;
for(i=0;i<4;i++)
{
int x2=x1+dir[i][0];
int y2=y1+dir[i][1];
if(x2>=0 && x2<3 && y2>=0 && y2<4)
{
if(idx[x2][y2]==1)
{
idx[x2][y2]=0;
dfs(x2*4+y2);
}
}
}
}
int connect(int arr[],int n)
{
int i,j;
memset(idx,0,sizeof(idx));
for(i=1;i<n;i++)
{
idx[arr[i]/4][arr[i]%4]=1;
}
dfs(arr[0]);
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(idx[i][j]==1)
return 0;
}
}
return 1;
}
void permutation(int arr[],int n,int cur)
{
int i,j;
if(cur==n)
{
int ok=connect(arr,n);
if(ok)
{
count++;
}

}
else
{
for(i=0;i<12;i++)
{
int ok=1;
for(j=0;j<cur;j++)
{
if(i<=arr[j])
{
ok=0;
break;
}
}
if(ok)
{
arr[cur]=i;
permutation(arr,n,cur+1);
}
}
}
}
int main()
{
int arr[5];
permutation(arr,5,0);
printf("count=%d ",count);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 遍历