HDOJ 1010迷宮 dfs 奇偶剪枝

2021-08-07 21:12:26 字數 1120 閱讀 2632

奇偶剪枝:

把矩陣標記成如下形式:

0,1,0,1,0

1,0,1,0,1

0,1,0,1,0

1,0,1,0,1

很明顯,如果起點在0 而終點在1 那顯然 要經過奇數步才能從起點走到終點,依次類推,奇偶相同的偶數步,奇偶不同的奇數步。在讀入資料的時候就可以判斷,並且做剪枝,當然做的時候並不要求把整個矩陣0,1刷一遍,讀入的時候起點記為(si,sj) 終點記為(di,dj) 判斷(si+sj) 和 (di+dj) 的奇偶性就可以了。

|cur.x-end.x|+|cur.y-end.y|(因為只能上下左右行走)表示當前位置和終點的距離

若該距離為偶數,表明奇偶相同,要經過偶數步才能到達,剩餘步數為m,(m-距離)&1,則表明m為奇數,不行;

若距離為奇數,需要經過奇數步。m也要為奇數。

所以temp=t-cnt-(|cur.x-end.x|+|cur.y-end.y|),if(temp&1||temp<0)直接retrun ;

當cnt==t到達終點時,返回true

**如下:

#include#include#includeusing namespace std;

char map[10][10];

int dir[4][2] = ,,, };

struct node

;int sx, sy, ex, ey,t;

int m, n;

bool dfs(node cur,int cnt)

}return 0;

}int main()

else if (map[i][j] == 'd')

else if (map[i][j] == 'x')

wall++;

}getchar();

}node start; start.x = sx; start.y = sy;

map[start.x][start.y] = 'x';

if (m*n - wall < t)

if(dfs(start,0))

cout << "yes\n";

else

cout << "no\n";

}return 0;

}

HDOJ 1010 DFS 迷宮 (奇偶剪枝)

這個題目用一般的搜尋無法完成,因為題目要求在指定的時間內完成,所以只好一步一步來啦,用dfs解決 但是如果這樣結果會超時,網上說是用一種奇偶剪枝的方法來間斷搜尋時間,下面是剪枝的簡單理論,一看就懂 把map看作 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 ...

HDOJ1010深搜 數學奇偶性剪枝

1010標準搜尋題,不過一開始很容易把題目看錯 易錯的理解 廣搜,在t秒之內從起點走到終點即可。純模版題 正確的理解 深搜,每個點在只能去一次的情況下,而且不能停留只能經過 這就要求我們把所有的路徑遍歷 方法 深搜 數學奇偶性剪枝 效率 578ms include include include i...

hdu 1010 dfs,奇偶剪枝

背景 熟悉dfs,第一次遇見了剪枝,各種剪枝。奇偶剪枝 開始一直超時,用了奇偶剪枝之後瞬間優化到312ms。對於乙個沒有障礙的圖,起點 s 到終點 的理想最短路徑是 而如果中間有障 礙物的話,路徑是在理想最短路徑上加上乙個偶數 可以證明 這樣可以看來,任何路徑和理想最短路徑是同奇偶的。這樣就可以剪去...