題目鏈結
#include
using
namespace std;
char ma[
105]
[105];
int vis[
105]
[105];
int flag;
int dir[4]
[2]=
;int num;
int xx,x2;
int yy,y2,m,n;
struct nodes,t;
intbfs()
q1.turn = p.turn +1;
//乙個方向都走過了只能轉彎了
for(
int i =
0; i <
4; i++
) q1.x +
= dir[i][0
];q1.y +
= dir[i][1
];// cout << q1.x << q1.y << q1.turn << endl;}}
} flag =0;
return0;
}int
main()
scanf
("%d%d%d%d%d"
,&num,
&s.y,
&s.x,
&t.y,
&t.x)
;//因為題目中x代表列所以要反過來
s.x--
;s.y--
;t.x--
;t.y--;if
(ma[s.x]
[s.y]
=='*'
|| ma[t.x]
[t.y]
=='*'
) flag =0;
else
bfs();
if(flag ==0)
printf
("no\n");
else
printf
("yes\n");
}return0;
}
第二種題解
這種方式也容易理解,關鍵是有兩個坑,第乙個要用三維標記陣列,第二個為什麼在主函式裡面就要給定起點方向然後進行四個方向的bfs,這是為了避免可能出現特殊的情況而出現問題,具體樣例在**最後。
#include
using
namespace std;
char mp[
105]
[105];
bool vis[
105]
[105][
4];int n,m,k,dir[
2]=;
// struct node
// }s,t;
bool
check
(int x,
int y)
// int dir[4][2] = ;
// int n,m,k;
struct node
}s,t;
// bool check(int x,int y)
bool
bfs(
int d)
for(
int i =
0; i <
4; i++))
;else q.
push()
;//printf("%d asd%d %d %d %d\n",i,q.top().x,q.top().y,q.top().t,q.size());
// cout << xx << yy << xturn << endl;}}
return
false;}
intmain()
scanf
("%d%d%d%d%d"
,&k,
&s.y,
&s.x,
&t.y,
&t.x)
; s.x--
;s.y--
;t.x--
;t.y--;if
(mp[s.x]
[s.y]
=='*'
|| mp[t.x]
[t.y]
=='*'
)bool flag =
false
;for
(int i =
0; i <
4; i++)if
(flag)
printf
("yes\n");
else
printf
("no\n");
}return0;
}/*25 4
**.*
...*
.*.*
.*.*
...*
1 1 5 3 1
*/
POJ 1175 連連看(BFS 記錄轉彎次數)
連連看,並且連線不能從外面繞過去,第一反應是bfs。樣例過了以為挺簡單的,wa了兩個小時。1 首先,一上來我們可以先排除一些情況,起始或目標為0 起始和目標不相等 起始和目標在同一位置,這三種情況直接no 2 int dir 用來記錄每一點的方向,0,1,2,3分別對應上下左右 3 再用int ch...
最小轉彎問題(bfs)
涉及考點 bfs 寬度優先搜尋算 題目描述 給出一張地圖,這張地圖被分為 n m n,m 100 個方塊,任何乙個方塊不是平地就是高山。平地可以通過,高山則不能。現在你處在地圖的 x1,y1 這塊平地,問 你至少需要拐幾個彎才能到達目的地 x2,y2 你只能沿著水平和垂直方向的平地上行進,拐彎次數就...
BFS 最小轉彎問題
description 給出一張地圖,這張地圖被分為 n m n,m 100 個方塊,任何乙個方塊不是平地就是高山。平地可以通過,高山則不能。現在你處在地圖的 x1,y1 這塊平地,問 你至少需要拐幾個彎才能到達目的地 x2,y2 你只能沿著水平和垂直方向的平地上行進,拐彎次數就等於行進方向的改變 ...