1. 程式人生 > 其它 >SSL_2325【最小轉彎問題】

SSL_2325【最小轉彎問題】

技術標籤:BFS佇列bfs

最小轉彎問題

題目

給出一張地圖,這張地圖被分為n×m(n,m<=100)個方塊,任何一個方塊不是平地就是高山。平地可以通過,高山則不能。現在你處在地圖的(x1,y1)這塊平地,問:你至少需要拐幾個彎才能到達目的地(x2,y2)?
你只能沿著水平和垂直方向的平地上行進,拐彎次數就等於行進方向的改變(從水平到垂直或從垂直到水平)的次數。例如:如圖1,最少的拐彎次數為5。

Input

第1行:n m
第2至n+1行:整個地圖地形描述(0:空地;1:高山)
第n+2行:x1 y1 x2 y2(分別為起點、終點座標)

Output

s(最小拐彎次數)

Sample Input

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

Sample Output

5

解析

同樣是BFS,只不過是四向while拓展而已
一遍過,時間0ms,空間1380K,與旁邊的大佬wc r一樣,但我排在前面,為什麼?
我code比wc r少0.03K
快樂就是如此簡單

code:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstdlib>
using namespace std;
int n,m,x1,y1,x2,y2,ak[4]={1,0,0,-1},ioi[4]={0,-1,1,0},t[110][110]; queue <int> b,c; bool check(int x,int y){if(x>=1&&x<=n&&y>=1&&y<=m&&t[x][y]==0)return 1;return 0;} void bfs() { int x,y,xx,yy; while(!b.empty()) { x=b.front(),y=c.front(),b.pop(),c.pop
(); if(x==x2&&y==y2) { printf("%d",t[x2][y2]-2);//面向輸出程式設計 exit(0); } for(int i=0;i<=3;i++) { xx=x+ak[i],yy=y+ioi[i];//懶得寫do-while,才不是沒想到 while(check(xx,yy)) { t[xx][yy]=t[x][y]+1; b.push(xx); c.push(yy);//打的時候沒加進隊,就很“舒服” xx+=ak[i],yy+=ioi[i]; } } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&t[i][j]),t[i][j]=-t[i][j];//日常疑惑改資料,蒟蒻常數大 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); t[x1][y1]=1; b.push(x1),c.push(y1); bfs(); return 0; }