蓝桥杯剪邮票

解释解释希望大家能更好理解,主函数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

#include
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<     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<                 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< }

你可能感兴趣的:(简单算法)