逃離迷宮(奇偶性剪枝)

2021-10-03 12:51:54 字數 1275 閱讀 9649

有乙個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...