poj 2023 Choose Your Own Adventure 用隊列廣搜 用棧深搜 用遞迴深搜 三種方法均測試過

來源:互聯網
上載者:User

題目大意:輸入一個整數n,表示有n組測試資料,

每組第一行輸入一個整數x表示該組測試一共有x頁,接下來輸入x行,每行表示一頁,

每頁或者以C開頭,或者以E開頭,中間用引號括起一段文字,注意第一行必須以C開頭,以C開頭的末尾輸入兩個數字a,b表示該頁完後可以跳轉到第a頁或第b頁,

以E開頭的末尾輸入一個單詞,或者是HAPPY或者是GRISLY(有且僅有一頁以HAPPY結尾),

現在要求你根據輸入找出以C開頭以E結尾,且E的行末為HAPPY的路徑,輸出路徑上每一頁中間引號裡面的內容,不包含引號。

用隊列廣搜:

#include<stdio.h>#include<string.h>char str[150][300];//原來的數組名為story,結果不能正常運行,story是系統保留字嗎?知道的回複一下int queue[150],pre[150],re[150],ff,tt,aa,bb;//pre[i]存第i行的祖先int main(){int t,x,i,len,count=0,j;scanf("%d",&t);while(t--){count++;scanf("%d",&x);getchar();for(i=1;i<=x;i++)gets(str[i]);//讀入內容queue[0]=1;//第一行入隊memset(pre,0,sizeof(pre));ff=tt=0;//ff表示對頭tt表示結尾while(1){len=strlen(str[queue[ff]]);if(str[queue[ff]][0]=='C'){aa=str[queue[ff]][len-3]-'0';//取出後面的數字bb=str[queue[ff]][len-1]-'0';if(pre[aa]==0)//其祖先為0,表示還未入隊,則把它如隊{queue[++tt]=aa;pre[aa]=queue[ff];//記錄其祖先為當前行號}if(pre[bb]==0)//同上{queue[++tt]=bb;pre[bb]=queue[ff];}ff++;//當前行出隊}else{if(str[queue[ff]][len-2]=='P')//如果是以HAPPY結束,直接跳出break;else ff++;}}memset(re,0,sizeof(re));re[0]=queue[ff];//最後一個的行號i=1;while(1)//回溯尋找路徑{re[i]=pre[re[i-1]];if(re[i]==0)break;else i++;}j=i-1;printf("STORY %d\n",count);for(;j>=0;j--){for(i=3;str[re[j]][i]!='"';i++)printf("%c",str[re[j]][i]);printf("\n");}}return 0;}

用棧深搜:

看了一位仁兄的遞迴深搜(下面附上),於是就練習了一下用棧深搜。

#include<stdio.h>#include<string.h>struct{char c,text[260],end[10];int a,b;}pag[102];//存每頁的內容,c頁類型;text頁內容 ;end結局;a、b兩個指向struct{int num[150],top;}zhan;//棧int x;int fang(int a)//檢查是否被訪問過,防止出現迴圈{int i;for(i=1;i<zhan.top;i++)if(a==zhan.num[i])return 1;return 0;}void shuru()//輸入{int k,j;scanf("%d",&x);for(j=1;j<=x;j++){getchar();pag[j].c=getchar();getchar();getchar();for(k=0;1;k++){pag[j].text[k]=getchar();if(pag[j].text[k]=='"'){pag[j].text[k]=0;break;}}getchar();if(pag[j].c=='C'){scanf("%d%d",&pag[j].a,&pag[j].b);}else{scanf("%s",pag[j].end);}}}void dfs()//深搜{zhan.top=-1;memset(zhan.num,0,sizeof(zhan.num));zhan.num[++zhan.top]=1;while(1){if(fang(zhan.num[zhan.top])){zhan.top--;}if(pag[zhan.num[zhan.top]].c=='E'){if(pag[zhan.num[zhan.top]].end[0]=='H')break;else{zhan.top--;}}else{if(0==zhan.num[zhan.top+1])//若上一棧為零,說明本棧第一次訪問,將a入棧{zhan.top++;zhan.num[zhan.top]=pag[zhan.num[zhan.top-1]].a;}else if(pag[zhan.num[zhan.top]].a==zhan.num[zhan.top+1])//若上一棧為a,即a被訪問過,則入棧b{zhan.top++;zhan.num[zhan.top]=pag[zhan.num[zhan.top-1]].b;}else//否則,a、b都被訪問過,該頁行不通,出棧{zhan.top--;}}}}void shuchu(int i)//從棧底到棧頂就是訪問路線,依次輸出{printf("STORY %d\n",i);for(i=0;i<=zhan.top;i++){puts(pag[zhan.num[i]].text);}}int main(){int t,i;scanf("%d",&t);for(i=1;i<=t;i++){shuru();dfs();shuchu(i);}return 0; }

用遞迴深搜:

#include<stdio.h>#include<string.h>#include<stdlib.h>struct story{char ch;char text[260];int ch1,ch2;char end[10];}st[102];int t,n,pos,flag;int mark[102];int ans[102];void solve(int num);void dfs(int p,int d);int main(){int i,j,k;scanf("%d",&t);for(i=0;i<t;i++){scanf("%d",&n);  for(j=0;j<n;j++){getchar();scanf("%c",&st[j].ch);if(st[j].ch=='C'){getchar();st[j].text[0]=getchar();for(k=1;;k++){st[j].text[k]=getchar();if(st[j].text[k]=='"')break;}scanf("%d%d",&st[j].ch1,&st[j].ch2);}else{getchar();st[j].text[0]=getchar();for(k=1;;k++){st[j].text[k]=getchar();if(st[j].text[k]=='"')break;}scanf("%s",st[j].end);}}solve(i+1);}return 0;}void solve(int num){int i,j;memset(mark,0,sizeof(mark));flag=0;dfs(0,0);printf("STORY %d\n",num);for(i=0;i<=pos;i++){for(j=1;;j++){if(st[ans[i]].text[j]=='"')break;printf("%c",st[ans[i]].text[j]);}printf("\n");}}void dfs(int p,int d){if(flag)return ;if(st[p].ch=='E'){if(!strcmp(st[p].end,"HAPPY")){flag=1;ans[d]=p;pos=d;}elsereturn ;}else{if(!mark[st[p].ch1]){mark[st[p].ch1]=1;dfs(st[p].ch1-1,d+1);if(flag){ans[d]=p;return;}}if(!mark[st[p].ch2]){mark[st[p].ch2]=1;dfs(st[p].ch2-1,d+1);if(flag){ans[d]=p;return;}}}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.