HDU1175 搜尋 剪枝

2021-09-09 07:02:53 字數 1077 閱讀 6154

題目鏈結: 連連看

題目大意: 給一張n*m大小的圖,問查詢的兩個點k1與k2之間能不能消掉,消掉的條件是通過走沒有東西的路徑拐彎不超過兩次到達目標點。(0表示沒有東西,>1的物品表示相應的東西),並且不能夠走外圍。

解題思路: 從起點向終點搜尋可行解,有乙個重要的剪枝是:當無轉彎的次數時,還沒到達與終點相同的行或列時排除該條搜尋分枝。

ac**:

#include #include #include #include using namespace std;

int image[1010][1010],n,m;

int vis[1010][1010];

int x1,y1,x2,y2,flag;

int _next[4][2] = ; //方向: right down left up

inline bool judge (int x, int y)

return true;

}void dfs (int x, int y, int dis, int change_size) //check1:可行與不可行

if(x == x2 && y == y2) //check2: 搜尋樹的葉

if(image[x][y] != 0 && dis != -1) //check3:非出發點與終點不能有值

if(change_size == 2 && (x != x2 && y != y2)) //check4: 無轉彎次數並且還沒到達與終點的相同行或列

int now_x,now_y;

for (int i = 0; i < 4; i++) else

if(flag == 1) return ;

} }return ;

}int main()

} //query:t

scanf("%d",&t);

while (t--) else

}else

} }return 0;

}

HDU 1175 廣度優先搜尋 BFS

題意 能不能將兩個位置的棋子 非0 消去,並不能超過兩次改變方向 題型 廣度優先搜尋 bfs 思路 將其中的乙個點作為起點,向外搜尋,看能否在限制條件之內找到另乙個點 個人總結 我做的時候沒考慮完全,所以沒有用陣列 中的num 儲存到達該點時轉向最少次數,所以一直 了!cpp include inc...

HDU 1175 連連看 DFS 剪枝

題目大意 連連看,中文題就不解釋了!解題思路 好坑的題呀,除錯了我n多個小時,怎麼都不對,後邊各種中間結果輸出都用上了,交上去一直wa。早上過來重新寫了一次,居然a了。完全不能理解呀!說下這個題吧,主要是對各個條件的剪枝上,其它都很簡單。在剪枝上的分析就不具體說了,給了很詳細的注釋了,各種細節注意就...

搜尋 HDU1175 連連看

題目 分析 這道題看到的第一反應應該就是bfs或者dfs,裸的dfs bfs顯然會tle,所以我就想用a 不過好像並不好寫啟發函式。列舉步數不行,就列舉邊吧。因為允許有兩次轉折,所以最多有三條邊列舉中間的一條邊,然後進行check,這道題只用了兩個for迴圈就ac了。include include ...