SSL_2325【最小轉彎問題】
阿新 • • 發佈:2020-12-26
最小轉彎問題
題目
給出一張地圖,這張地圖被分為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;
}