先用全排列选出5张邮票,然后再判断是不是连通图就好了。
dfs和bfs都可以做
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int ans[12]={0,0,0,0,0,0,0,1,1,1,1,1};
int ok[10][10];
int Count;
int jishu=0;
/*void bfs(int x,int y){
queue<int> q;
Count=0;
q.push(x);
q.push(y);
ok[x][y]=0;//入队置零
while(!q.empty()){
Count++;
int i=q.front();q.pop();
int j=q.front();q.pop();
if(ok[i+1][j]){q.push(i+1);q.push(j);ok[i+1][j]=0;}
if(ok[i-1][j]){q.push(i-1);q.push(j);ok[i-1][j]=0;}
if(ok[i][j+1]){q.push(i);q.push(j+1);ok[i][j+1]=0;}
if(ok[i][j-1]){q.push(i);q.push(j-1);ok[i][j-1]=0;}
}
}*/
void dfs(int x,int y)
{
Count++;
ok[x][y]=0;//走过的地方置零
if(x+1<=3&&ok[x+1][y])dfs(x+1,y);
if(x-1>=1&&ok[x-1][y])dfs(x-1,y);
if(y+1<=4&&ok[x][y+1])dfs(x,y+1);
if(y-1>=1&&ok[x][y-1])dfs(x,y-1);
}
int main()
{
do{
memset(ok,0,sizeof(ok));
for(int i=1;i<=3;i++)//该排列形成一种剪法
{
for(int j=1;j<=4;j++){
ok[i][j]=ans[(i-1)*4+j-1];
//printf("%d ",ok[i][j]);
}
// printf("\n");
}
Count=0;
for(int i=0;i<12;i++)
{
if(ok[i/4+1][i%4+1]==1)//找到第一个1
{
//bfs(i/4+1,i%4+1);
dfs(i/4+1,i%4+1);
break;
}
}
if(Count==5)jishu++;
printf("%d\n",Count);
}while(next_permutation(ans,ans+12));
printf("%d",jishu);
return 0;
}