个题有几个地方可以借鉴,给格子的编号,判断连通性等地方。

 

题目描述:

 

如【图1.jpg】, 有12张连在一起的12生肖的邮票。

第七届蓝桥杯【省赛试题7】剪邮票_System

现在你要从中剪下5张来,要求必须是连着的。
(仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

第七届蓝桥杯【省赛试题7】剪邮票_连通性_02

第七届蓝桥杯【省赛试题7】剪邮票_System_03


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

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

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

题目答案:

116

题目思路:

枚举五种数的所有组合然后判断这五个数是否连通即可。判断连通性可以用DFS来判断,上下左右四个方向可以将题目中的1,2,3,4,5,6,7,8,9,10数字进行转换,4和5是无法连通的,可以将其变为1,2,3,4,6,7,8,9,11,12,13,14如图,这样我就可以实现左右分别+1和-1,上下分别+5和-5来实现。

第七届蓝桥杯【省赛试题7】剪邮票_System_04

 

题目JAVA代码:

public class 剪邮票
{
static int[] data=new int[]{1,2,3,4,6,7,8,9,11,12,13,14};
static int[] arr=new int[5];
static int[] vis=new int[5];
static int[] dir=new int[]{1,-1,5,-5};
static int ans=0;

public static void main(String[] args) {
for (int a = 0; a < data.length; a++) {
for (int b = a+1; b < data.length; b++) {
for (int c = b+1; c < data.length; c++) {
for (int d = c+1; d < data.length; d++) {
for (int e = d+1; e < data.length; e++) {
arr[0]=data[a];
arr[1]=data[b];
arr[2]=data[c];
arr[3]=data[d];
arr[4]=data[e];
vis=new int[5];
vis[0]=1;
dfs(0);
boolean fal=true;
for (int i = 0; i < 5; i++) {
if(vis[i]==0)
fal=false;
}
if(fal){
ans++;
// for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[i]+" ");
// }
// System.out.println();
// for (int i = 0; i < arr.length; i++) {
// System.out.print(vis[i]+" ");
// }
// System.out.println();
}
}
}
}
}
}
System.out.println(ans);
}

//判断连通性
private static void dfs(int u) {
for(int i=0 ;i<4 ;i++){
int t = arr[u]+dir[i];
if(t>=1&&t<=14){
for(int j=0 ;j<5 ;j++)
if(t==arr[j]&&vis[j]==0){
vis[j]=1;
dfs(j);
}
}
}
}
}