題目大意:= = 因為是中文題,就不多說了。 題目對兩塊棋子能否消除的限制為 兩者之間的連線不能轉向2次以上,並且不能穿過其他棋子.
個人想法:dfs.如果能滿足題目的條件從一塊搜尋到另一塊,那麼就輸出yes,否則no。
= =。 但這邊不知道為何,如果沒有在轉向兩次以後進行剪枝(接下去就只朝乙個方向走)的話,就是超時.
結合網上的題解,進行了剪枝.
剪了枝之後時間一下子就從超時降到了 3700ms.
- -. 只能在這邊感嘆搜尋演算法中剪枝的重要性.
以下是ac**
#include #include int map[1010][1010];
char vis[1010][1010];
int m,n;
int tx = ;
int ty = ;
/* 0:原地,1:上,2:下,3:左,4:右 */
int dfs(int s_x,int s_y,int e_x,int e_y,int dir,int change)
if(vis[s_x][s_y])
return 0;
int i;
int ex;
int ey;
int ans = 0;
vis[s_x][s_y] = 1;
if(change==3)
}/*摘自網上的對於 換了2次後的 優化*/
else
else
}} }
vis[s_x][s_y] = 0;/*為了回溯*/
return 0;
}int main(int argc, char const *argv)
} }return 0;
}
第一篇題解
也是前幾道搜尋的嘗試,第一次體會到剪枝的牛x.
如果有什麼問題,歡迎指出,
如果有什麼錯誤,也請看官輕拍.
HDU 1175 連連看 搜尋,dfs
類似於迷宮問題,主要就在轉折的處理上,在這裡可以有乙個強剪枝,具體見 參考部落格 感謝!include include include include using namespace std int map 1010 1010 int tmap 1010 1010 int n,m,q int x1,...
搜尋 HDU1175 連連看
題目 分析 這道題看到的第一反應應該就是bfs或者dfs,裸的dfs bfs顯然會tle,所以我就想用a 不過好像並不好寫啟發函式。列舉步數不行,就列舉邊吧。因為允許有兩次轉折,所以最多有三條邊列舉中間的一條邊,然後進行check,這道題只用了兩個for迴圈就ac了。include include ...
HDU 1175 連連看 DFS 剪枝
題目大意 連連看,中文題就不解釋了!解題思路 好坑的題呀,除錯了我n多個小時,怎麼都不對,後邊各種中間結果輸出都用上了,交上去一直wa。早上過來重新寫了一次,居然a了。完全不能理解呀!說下這個題吧,主要是對各個條件的剪枝上,其它都很簡單。在剪枝上的分析就不具體說了,給了很詳細的注釋了,各種細節注意就...