NYOJ 58 最小步數
阿新 • • 發佈:2019-02-20
最小步數
題目資訊:這道題就是一個簡單的迷宮搜尋,可以用佇列作簡單模擬。
原始碼:
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct num{ int x,y; //座標 int step; //步數 }; queue<num>Q; //定義一個結構體型別的佇列 int map[9][9]= //模擬迷宮地圖 { 1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; int fx[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; //方向 int visit[9][9]; //標記足跡 int mg(int x1,int y1,int x2,int y2) //計算最小步數 { num e={x1,y1,0}; //將起點位置付給e,步數為0 Q.push(e); visit[x1][y1]=1; //標記此處走過 while(!Q.empty()) { e=Q.front(); //將隊首付給e if(e.x==x2&&e.y==y2) //判斷是否到達了目的地 break; Q.pop(); int i,s,t; for(i=0;i<4;i++) //向其他方向查詢下一步 { s=e.x+fx[i][0]; t=e.y+fx[i][1]; if(s>=0&&s<=8&&t>=0&&t<=8&&!visit[s][t]&&map[s][t]==0) //判斷邊界 { num e1={s,t,e.step+1}; //步數+1 Q.push(e1); //將步數+1的元素入隊 visit[s][t]=1; //標記走過的位置 } } } while(!Q.empty()) //清空佇列 Q.pop(); return e.step; //返回最小步數 } int main() { int n; scanf("%d",&n); while(n--) { int k; int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); memset(visit,0,sizeof(visit)); //清除標記 k=mg(x1,y1,x2,y2); printf("%d\n",k); } return 0; }