處理連連看問題。
要求拐彎方向不多於兩次。剪枝很重要!!!
用dir記錄當前方向。orz,居然沒想到。
1 #include2 #include3 #include4#define maxn 1005
5using
namespace
std;
6const
int dx=,dy=;
7int
map[maxn][maxn],v[maxn][maxn];
8int
n,m,flag,x1,x2,y1,y2;
9void dfs(int x,int y,int num,int
dir)
17if (map[x][y]!=0
)//當前不為零且不為起點,即路徑上有棋子
21 v[x][y]=1;22
for (int i=0;i<4;i++)
27 v[x][y]=0;28
return;29
}30intmain()38}
39 cin >>t;
40while (t--)//
起點與終點相同不能消去
47if (map[x1][y1]!=map[x2][y2] || !map[x1][y1] || !map[x2][y2])//
起點與終點不同,或起點或終點位置沒有棋子
51if (x1<0 || x1>=n || y1<0 || y1>=m || x2<0 || x2>=n || y2<0 || y2>=m)//
所給座標超出當前範圍
55 flag=0
;56 memset(v,0,sizeof
(v));
57for (int i=0;i)
60if (flag) cout << "
yes\n";
61else cout << "
no\n";
62}63}
64return0;
65 }
hdoj 1175 連連看 dfs 剪枝
題目大意 題目給出一副連連看的圖形,其中0代表沒有物品,其餘數字代表該位置的物品,規定,每次消除所經過的路徑不能超過兩次專向。另外,不能在圖外進行轉向。問,對於q個詢問,是否能夠消除。每乙個詢問都是對於初始圖而言的,解題思路 dfs 剪枝。其實沒什麼好說的,有幾個要注意的地方,第乙個是判重,第二個是...
HDU 1175連連看 dfs記錄方向 強力剪枝
題目大意 與連連看類似,不過不同的是它不能從外面繞過去,這相當於降低了題目難度。需要注意的是,如果你在搜尋過程中遇到了和起點位置一樣的數,但它不是終點位置的話需要返回。include includeusing namespace std const int maxn 1010 int vis max...
hdu 1175 連連看 dfs搜尋
題目大意 因為是中文題,就不多說了。題目對兩塊棋子能否消除的限制為 兩者之間的連線不能轉向2次以上,並且不能穿過其他棋子.個人想法 dfs.如果能滿足題目的條件從一塊搜尋到另一塊,那麼就輸出yes,否則no。但這邊不知道為何,如果沒有在轉向兩次以後進行剪枝 接下去就只朝乙個方向走 的話,就是超時.結...