天天看點

藍橋杯剪郵票

解釋解釋希望大家能更好了解,主函數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;    

}

繼續閱讀