2019年第十屆藍橋杯C/C++程序設計本科B組省賽 E迷宮
阿新 • • 發佈:2019-04-19
return 分享圖片 文本 %s queue void 右下角 字符串 開始
試題 E: 迷宮 本題總分:15 分 【問題描述】 下圖給出了一個迷宮的平面圖,其中標記為 1 的為障礙,標記為 0 的為可 以通行的地方。 010000 000100 001001 110000 迷宮的入口為左上角,出口為右下角,在迷宮中,只能從一個位置走到這 個它的上、下、左、右四個方向之一。 對於上面的迷宮,從入口開始,可以按DRRURRDDDR 的順序通過迷宮, 一共 10 步。其中 D、U、L、R 分別表示向下、向上、向左、向右走。 對於下面這個更復雜的迷宮(30 行 50 列) ,請找出一種通過迷宮的方式, 其使用的步數最少,在步數最少的前提下,請找出字典序最小的一個作為答案。 請註意在字典序中D<L<R<U。(如果你把以下文字復制到文本文件中,請務 必檢查復制的內容是否與文檔中的一致。在試題目錄下有一個文件 maze.txt, 內容與下面的文本相同) 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 01000000001010100011010000101000001010101011001011 00011111000000101000010010100010100000101100000000 11001000110101000010101100011010011010101011110111 00011011010101001001001010000001000101001110000000 10100000101000100110101010111110011000010000111010 00111000001010100001100010000001000101001100001001 1100011010000111001000100101010101010101000110100000010000100100000101001010101110100010101010000101 11100100101001001000010000010101010100100100010100 00000010000000101011001111010001100000101010100011 10101010011100001000011000010110011110110100001000 10101010100001101010100101000010100000111011101001 10000000101100010000101100101101001011100000000100 10101001000000010100100001000100000100011110101001 00101001010101101001010100011010101101110000110101 11001010000100001100000010100101000001000111000010 00001000110000110101101000000100101001001000011101 10100101000101000000001110110010110101101010100001 00101000010000110101010000100010001001000100010101 10100001000110010001000010101001010101011111010010 00000100101000000110010100101001000001000000000010 1101000000100111011100100100001110100101101110100000000110100010001000100000001000011101000000110011 10101000101000100010001111100010101001010000001000 10000010100101001010110000000100101010001011101000 00111100001000010000000110111000000001000000001011 10000001100111010111010001000110111010101101111000 【答案提交】 這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一 個字符串,包含四種字母 D、U、L、R,在提交答案時只填寫這個字符串,填 寫多余的內容將無法得分。
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 const int N =50; 7 int n,m; 8 char s[N][N]; 9 bool vis[N][N]; 10 struct Node{ 11 int x,y,step; 12 int dir[200]; 13 }; 14 int di[4][2]={{1,0},{0,-1},{0,1},{-1,0}};//DLRU的優先級,因此最後 15 //輸出的結果就是字典序最小的 16 bool check(int x,int y) 17 { 18 if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]==‘0‘&&!vis[x][y]) 19 return 1; 20 return 0; 21 } 22 void bfs() 23 { 24 Node now,next; 25 queue<Node>q; 26 now.x=0,now.y=0,now.step=0,now.dir[0]=-1; 27 q.push(now); 28 vis[0][0]=1; 29 while(!q.empty()){ 30 now = q.front();q.pop(); 31 if(now.x==n-1&&now.y==m-1){ 32 printf("%d\n",now.step); 33 for(int i=1;i<=now.step;i++){ 34 if(now.dir[i]==0) printf("D"); 35 else if(now.dir[i]==1) printf("L"); 36 else if(now.dir[i]==2) printf("R"); 37 else if(now.dir[i]==3) printf("U"); 38 } 39 break; 40 } 41 for(int i =0;i<4;i++){//DLRU 42 int x = now.x+di[i][0]; 43 int y = now.y+di[i][1]; 44 if(check(x,y)){ 45 vis[x][y] =1; 46 next = now;//保證now指向的連續,便於輸出這條路徑 47 next.x=x; 48 next.y=y; 49 next.step=now.step+1; 50 next.dir[next.step]=i;//next始終不變 51 q.push(next); 52 } 53 } 54 } 55 } 56 int main() 57 { 58 freopen("1.txt","r",stdin); 59 scanf("%d%d",&n,&m); 60 for(int i =0;i<n;i++) scanf("%s",s[i]); 61 memset(vis,0,sizeof(vis)); 62 bfs(); 63 return 0; 64 }
2019年第十屆藍橋杯C/C++程序設計本科B組省賽 E迷宮