生活随笔
收集整理的這篇文章主要介紹了
迷宫绕行(BFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1767: 迷宮繞行
時間限制: 1 Sec 內存限制: 128 MB
題目描述
給定一個m × n (m行, n列)的迷宮,迷宮中有兩個位置,魚頸肥想從迷宮的一個位置走到另外一個位置,當然迷宮中有些地方是空地,魚頸肥可以穿越,有些地方是障礙,她必須繞行,從迷宮的一個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,魚頸肥不能走到迷宮外面去。令人頭痛的是,魚頸肥是個沒什么方向感的人,因此,她在行走過程中,不能轉太多彎了,否則她會暈倒的。我們假定給定的兩個位置都是空地,初始時,魚頸肥所面向的方向未定,她可以選擇4個方向的任何一個出發,而不算成一次轉彎。魚頸肥能從一個位置走到另外一個位置嗎?
輸入
第1行為一個整數t(1≤t≤100),表示測試數據的個數,接下來為t組測數據,
每組第1行為兩個整數m,n(1≤m,n ≤100),表示該位置為障礙,輸入數據中只有這兩種字符,
每組測試數據的最后一行為5個整數K,X 1,Y 1,X 2,Y 2(1≤ ? ≤10,1≤X 1,X 2 ≤N,1個≤Y 1,Y 2 ≤m),
其中?表示魚頸肥最多能轉的彎數,(X 1,Y 1),(X 2,Y 2)表示兩個位置,其中X 1,X 2對應列,Y 1,Y 2 對應行
輸出
每組測試數據對應為一行,若凱萊能從一個位置走到另外一個位置,輸出“是”,否則輸出“不”。
樣例輸入
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
樣例輸出
no
yes
提示
‘.’ 表示 空地 ‘*’ 表示障礙
來源
AC_code:
#include <iostream>
#include <queue>
using namespace std
;
char a
[105][105];
bool vis
[105][105];
int dx
[]= {-1,1,0,0},dy
[]= {0,0,-1,1};
int m
,n
;
int k
;
struct data
{int x
;int y
;int cnt
;bool operator
==(data
&p
){return x
==p
.x
&&y
==p
.y
;}
};
bool
check(int x
,int y
)
{if(x
>=1&&x
<=m
&&y
>=1&&y
<=n
&&a
[x
][y
]!='*')return true
;return false
;
}
data s
,e
;
int BFS()
{queue
<data
>q
;s
.cnt
= -1;q
.push(s
);vis
[s
.x
][s
.y
] = true
;while(!q
.empty()){data t1
= q
.front();if(t1
==e
&&t1
.cnt
<=k
){return 1;}q
.pop();for(int i
= 0; i
< 4; i
++){data t2
;t2
.x
= t1
.x
+ dx
[i
];t2
.y
= t1
.y
+ dy
[i
];while(check(t2
.x
,t2
.y
)){if(!vis
[t2
.x
][t2
.y
]){t2
.cnt
= t1
.cnt
+ 1;vis
[t2
.x
][t2
.y
] = true
;q
.push(t2
);}data t3
;t3
.x
= t2
.x
+ dx
[i
];t3
.y
= t2
.y
+ dy
[i
];t2
= t3
;}}}return 0;
}
int main()
{int t
;cin
>>t
;while(t
--){cin
>>m
>>n
;for(int i
= 1; i
<= m
; i
++){cin
>>a
[i
]+1;for(int j
= 1; j
<= n
; j
++){vis
[i
][j
] = false
;}}cin
>>k
>>s
.y
>>s
.x
>>e
.y
>>e
.x
;if(BFS())cout
<<"yes"<<endl
;elsecout
<<"no"<<endl
;}return 0;
}
總結
以上是生活随笔為你收集整理的迷宫绕行(BFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。