题意描述:有12张连在一起的12生肖的邮票。从中剪下5张,要求邮票连通,角对角不满足要求,求方案数目。
思路:利用多重循环,枚举5张邮票分别可能存在的位置,并验证其连通性。特别要考虑4,8和5,9的情况,用dfs()即可解决问题。
#include<iostream>
#include<cstring>
using namespace std;
int dis[4]={-1,1,4,-4},visit[13];
int i1,i2,i3,i4,i5,cnt,ans=0;
void dfs(int index){
if(cnt>=5) return;
for(int i=0;i<4;i++){
if ((dis[i] == 1 && (index == 4 || index == 8)) || (dis[i] == -1 && (index == 5 || index == 9))) continue;
int t = index + dis[i];
if(t>=1&&t<=12&&visit[t]==0&&(t==i2||t==i3||t==i4||t==i5)){
visit[t]=1;
cnt++;
dfs(t);
}
}
}
int main(){
for(i1=1;i1<=8;i1++)
for(i2=i1+1;i2<=9;i2++)
for(i3=i2+1;i3<=10;i3++)
for(i4=i3+1;i4<=11;i4++)
for(i5=i4+1;i5<=12;i5++){
memset(visit,0,sizeof(visit));
cnt=1;
dfs(i1);
if(cnt==5) ans++;
}
cout<<ans;
return 0;
}