基礎搜尋題 最少轉彎問題
阿新 • • 發佈:2018-12-23
給出一張地圖,這張地圖被分為n×m(n,m<=100)個方塊,任何一個方塊不是平地就是高山。平地可以通過,高山則不能。現在你處在地圖的(x1,y1)這塊平地,問:你至少需要拐幾個彎才能到達目的地(x2,y2)?你只能沿著水平和垂直方向的平地上行進,拐彎次數就等於行進方向的改變(從水平到垂直或從垂直到水平)的次數。例如:如圖,最少的拐彎次數為5。
輸入
第1行:n m
第2至n+1行:整個地圖地形描述(0:空地;1:高山),
如(圖) 第2行地形描述為:1 0 0 0 0 1 0
第3行地形描述為:0 0 1 0 1 0 0
……
第n+2行:x1 y1 x2 y2 (分別為起點、終點座標)
輸出
輸出s (即最少的拐彎次數)
樣例輸入
5 7
1 0 0 0 0 1 0
0 0 1 0 1 0 0
0 0 0 0 1 0 1
0 1 1 0 0 0 0
0 0 0 0 1 1 0
1 3 1 7
樣例輸出
5
一道簡單的廣度搜索題,唯一變化的是要在結構體中加入方向這一變數,來求最後的答案。
#include <cstring> #include <iostream> #include <cstdio> #include <queue> using namespace std; struct node { int x,y,cnt; char dc; //結構體中加入判斷方向的變數 }; int n,m; int fd[110][110]; //判斷路徑是否走過的標記 queue<node>p; int bfs(int x1,int y1,int x2,int y2) { node no; no.x=x1; no.y=y1; no.cnt=0; no.dc='0'; a=0,b=0,l=0,r=0; fd[x1][y1]=1; //入佇列 p.push(no); while(!p.empty()) { int x,y,k; char ch; node z; z=p.front(); p.pop(); x=z.x; y=z.y; k=z.cnt; ch=z.dc; if(x==x2&&y==y2)return k; for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) { if(i!=j&&i+j!=0) { if(x+i>=1&&x+i<=n&&y+j>=1&&y+j<=m) { if(fd[x+i][y+j]==0) { char chh; z.x=x+i; z.y=y+j; if(i==1)chh='b'; //判斷方向 if(i==-1)chh='a'; if(j==1)chh='r'; if(j==-1)chh='l'; fd[z.x][z.y]=1; if(chh==ch||ch=='0')z.cnt=k; else z.cnt=k+1; z.dc=chh; p.push(z); } } } } } int main()
{ while(scanf("%d%d",&n,&m)==2) { int x1,x2,y1,y2; int O; memset(fd,0,sizeof(fd)); while(!p.empty())p.pop(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&O); if(O==1)fd[i][j]=1; } } scanf("%d%d%d%d",&x1,&y1,&x2,&y2); printf("%d\n",bfs(x1,y1,x2,y2)); } return 0; }