解释解释希望大家能更好理解,主函数main里面p[5]是代表符合条件的邮票的数字,每次找到一种然后通过bfs来判断,通过广度遍历来搜索,如果这儿不懂得话,自己去拿数据结构的数来看看,不然这个也不是一两句就能说清楚的,我的表达能力也不好,通过队列辅助。num代表第一个数0,也就是p[0],设置一个c,如果最后的值为4,那么返回1代表这个数组符合,+1,反之返回0,有一串很长的if语句里面的条件是代表判断两个数实在同意而还是同一行的,比如4,5不好判断就通过这个条件来。
另外我有两个问题如果有大神能帮我解决感激不尽:
1.为什么那个int v[5]哨兵不能设置为全局变量,一设置就出错之只能够判断第一个数组,其他的都不能
2.这个题目表述不清,像2,3,6,7,10这样的数到底能不能符合条件,当然我这题算符合条件
#include<iostream>
#include<cmath>using namespace std;
struct Que{
int rear=-1;
int front=-1;
int D[10]={0};
};
int bfs(int q[],int num){
int v[5]={0};
int c=0;
Que d;
// cout<<q[num]<<" ";
v[num]=1;
d.D[++d.rear]=num;
while(d.front!=d.rear){
int t=d.D[++d.front];
for(int i=0;i<5;i++){
if(v[i]==0 && ((q[t]+1==q[i]&&(q[t]-1)/4==(q[i]-1)/4)||(q[t]+4==q[i])||(q[t]-1==q[i]&&(q[t]-1)/4==(q[i]-1)/4)||(q[t]-4==q[i]))){
// cout<<q[i]<<" ";
v[i]=1;
d.D[++d.rear]=i;
c++;
}
}
}
if(c==4)
return 1;
return 0;
}
int main(){
int p[5];
int a,b,c,d,e,count=0;
for(a=1;a<9;a++){
for(b=a+1;b<10;b++){
for(c=b+1;c<11;c++){
for(d=c+1;d<12;d++){
for(e=d+1;e<13;e++){
p[0]=a;
p[1]=b;
p[2]=c;
p[3]=d;
p[4]=e;
if(bfs(p,0)==1)//{
count++;
// v[5]=0;
// }
}
}
}
}
cout<<count;
}