1010: 機器人走迷宮
阿新 • • 發佈:2018-12-15
實現程式碼:
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <vector> #include <queue> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ struct Status{ int x,y; int t; int d; }; queue<Status> Q; bool mark[20][20] = {false}; char maze[20][20]; int getDr(char c){// 獲得朝向 switch(c){ case 'U': return 0; case 'R': return 1; case 'D': return 2; case 'L': return 3; } } bool result(int x,int y){ // 判斷當前位置是否是結果 if(mark[x-1][y]==true&&mark[x+1][y]==true&&mark[x][y-1]==true&&mark[x][y+1]==true){ return true; } return false; } void getNextLocation(int *x,int* y,Status &s){ if(s.d==0){ *x = s.x-1; *y = s.y; return; } if(s.d==1){ *x = s.x; *y = s.y+1; return; } if(s.d==2){ *x = s.x+1; *y = s.y; return; } if(s.d==3){ *x = s.x; *y = s.y-1; return; } } int BFS(int w,int h){ while(!Q.empty()){ Status cur = Q.front(); Q.pop(); if(result(cur.x,cur.y))return cur.t; // 在BFS中 要弄清楚目標狀態是什麼 如果是目標狀態 返回結果 int nx; int ny; getNextLocation(&nx,&ny,cur); if(mark[nx][ny]==true||maze[nx][ny]=='*'){ mark[nx][ny] = true; cur.d = (cur.d+1)%4; // 右轉 Q.push(cur); continue; }else{ mark[nx][ny] = true; cur.x = nx; cur.y = ny; cur.t = cur.t+1; Q.push(cur); continue; } } return 1; } int main(int argc, char** argv) { int w,h; while(scanf("%d%d",&w,&h)){ // 清空上一次的資料 while (!Q.empty()) { Q.pop(); } for (int i = 0; i < 20; i++) { for (int j = 0; j < 20; j++) { mark[i][j] = false; maze[i][j] = 0; } } // 進入這一次的輸入 for(int i=1;i<=w;i++){ scanf("%s",maze[i]+1); } mark[1][1] = true; for(int i=0;i<=w+1;i++){ mark[i][0] = true; mark[i][h+1] = true; } for(int j=0;j<=h+1;j++){ mark[0][j] = true; mark[w+1][j] = true; } Status temp; temp.x=temp.y=temp.t=1; temp.d = getDr(maze[1][1]); Q.push(temp); int ret = BFS(w,h); printf("%d\n",ret); //printf("%c",maze[1][1]); } return 0; }