有乙個n*m大小的迷宮。其中字元』表示』起點,字元『d』表示出口,字元』x』表示牆壁。字元』.『表示空地,從』s』出發走到』d』,每次只能向上下左右相鄰的位置移動,並且不能 走出地圖,也不能走進牆壁。
每次移動消耗1時間,走過的路都會塌陷,因此不能走回頭路或者原地不動。現在已知出口的大門會在t時間開啟,從起點能否逃離迷宮。
資料範圍n,m<=10,t<=50。
分析:我們需要用dfs搜尋每一條路線,並且只需搜到t時間就可以了(這是乙個可行性剪枝)
奇偶性剪枝:
如上圖所示,將n*m的網格染成黑白兩色。我們記錄每乙個格仔的行列數之和為x,如果x為偶數,那麼格仔就是白色,反之為奇數時就為黑色。容易發現相鄰的兩個格仔顏色肯定不一樣,也就是說每走一步顏色都會不一樣。更普遍的結論:走偶數步不會改變顏色,走奇數步會改變顏色。
那麼如果起點和終點顏色一樣,而t是奇數的話,就不可能逃離迷宮。同理,如果起點和終點顏色不一樣,而t是偶數的話也不能逃離。遇到這兩種情況時,就不用進行dfs了,直接輸出「no」。
這裡用乙個通用公式:
(x1+y1+x2+y2+t)%2!=0該公式為真,就不可能逃出迷宮
.
#include
using namespace std;
int n,m,t;
char mat[10]
[10];
bool vis[10]
[10];
int dx[4]
=;int dy[4]
=;bool ok;
void
dfs(
int x,
int y,
int t)
return;}
vis[x]
[y]=true;
for(
int i=
0;i<
4;i++
)dfs
(tx,ty,t+1)
;}vis[x]
[y]=false;
}int
main()
int sx,sy,ex,ey;
for(
int i=
0;i(mat[i]
[j]==
'd')}}
if((sx+sy+ex+ey+t)%2
!=0)else
}
奇偶性剪枝
我們先來看一道題目 有乙個n x m大小的迷宮。其中字元 s 表示起點,字元 d 表示出口,字元 x 表示牆壁,字元,表示平地。你需要從 s 出發走到 d 每次只能向上下左右相鄰的位置移動,並且不能走出地圖,也不能走進牆壁。每次移動消耗1時間,走過路都會塌陷,因此不能走回頭路或者原地不動。現在已知出...
1085 判斷奇偶性
判斷奇偶性 time limit 1000ms memory limit 65536k total submit 128 accepted 58 description 計算乙個無符號整數x的二進位制中1的個數是奇數還是偶數。input 多組測試資料。每組測試資料報括乙個無符號整數n 0 n 2 3...
HDOJ1010深搜 數學奇偶性剪枝
1010標準搜尋題,不過一開始很容易把題目看錯 易錯的理解 廣搜,在t秒之內從起點走到終點即可。純模版題 正確的理解 深搜,每個點在只能去一次的情況下,而且不能停留只能經過 這就要求我們把所有的路徑遍歷 方法 深搜 數學奇偶性剪枝 效率 578ms include include include i...