奇偶剪枝:
把矩陣標記成如下形式:
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 到終點 的理想最短路徑是 而如果中間有障 礙物的話,路徑是在理想最短路徑上加上乙個偶數 可以證明 這樣可以看來,任何路徑和理想最短路徑是同奇偶的。這樣就可以剪去...