hdoj 1175 連連看 dfs 剪枝

2021-06-04 19:40:54 字數 1108 閱讀 2066

【題目大意】:題目給出一副連連看的圖形,其中0代表沒有物品,其餘數字代表該位置的物品,規定,每次消除所經過的路徑不能超過兩次專向。另外,不能在圖外進行轉向。問,對於q個詢問,是否能夠消除。每乙個詢問都是對於初始圖而言的,

【解題思路】:dfs+剪枝。其實沒什麼好說的,有幾個要注意的地方,第乙個是判重,第二個是記住最多僅能夠進行兩次轉向。切記,在判斷到達目標的時候,需要判斷其轉向次數是否超過兩次,表示個人在此處wa了兩次。

純暴力版過了之後。有乙個剪枝是:在轉向兩次之後,因為不可轉向,所以接下來必須與之前的方式保持一致,這個優化減少了5s左右的時間,原先是7000ms,現在是2000ms。

【**】:

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

#define eps 1e-8

#define pi acos(-1.0)

#define pb push_back

#define lc(x) (x << 1)

#define rc(x) (x << 1 | 1)

#define lowbit(x) (x & (-x))

#define ll long long

int stx[4]=;

int sty[4]=;

int a[1100][1100];

int vis[1100][1100];

int n,m,x,y,xx,yy,q,tmp;

bool flag;

bool solve(int x,int y,int xx,int yy,int cnt,int dir)

if (a[x][y]!=0 && cnt!=-1) return false;

if (cnt>2) return false;

else {

if (cnt==2){ //優化部分

vis[x][y]=tmp;

tx=x+stx[dir];

ty=y+sty[dir];

if (tx>=0 && tx=0 && ty=0 && tx=0 && ty

hdoj1175 連連看(dfs 剪枝)

處理連連看問題。要求拐彎方向不多於兩次。剪枝很重要!用dir記錄當前方向。orz,居然沒想到。1 include2 include3 include4 define maxn 1005 5using namespace std 6const int dx dy 7int map maxn maxn ...

HDU 1175連連看 dfs記錄方向 強力剪枝

題目大意 與連連看類似,不過不同的是它不能從外面繞過去,這相當於降低了題目難度。需要注意的是,如果你在搜尋過程中遇到了和起點位置一樣的數,但它不是終點位置的話需要返回。include includeusing namespace std const int maxn 1010 int vis max...

hdu 1175 連連看 dfs搜尋

題目大意 因為是中文題,就不多說了。題目對兩塊棋子能否消除的限制為 兩者之間的連線不能轉向2次以上,並且不能穿過其他棋子.個人想法 dfs.如果能滿足題目的條件從一塊搜尋到另一塊,那麼就輸出yes,否則no。但這邊不知道為何,如果沒有在轉向兩次以後進行剪枝 接下去就只朝乙個方向走 的話,就是超時.結...