題目鏈結: 連連看
題目大意: 給一張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 ...