hdu 1175 连连看(dfs+剪枝)

一些细节没处理好,wa了很多次。

剪枝不强,跑了6000+ms。

View Code
 1 /*
 2 Author:Zhaofa Fang
 3 Lang:C++
 4 */
 5 #include <cstdio>
 6 #include <cstdlib>
 7 #include <sstream>
 8 #include <iostream>
 9 
10 #include <cstring>
11 #include <algorithm>
12 #include <string>
13 #include <utility>
14 #include <vector>
15 #include <queue>
16 #include <stack>
17 #include <map>
18 #include <set>
19 
20 using namespace std;
21 
22 typedef long long ll;
23 #define DEBUG(x) cout<< #x << ':' << x << endl
24 #define PII pair<int,int>
25 #define PB push_back
26 #define MP make_pair
27 #define FI first
28 #define SE second
29 #define lowbit(x) (x&(-x))
30 #define INF (1<<30)
31 
32 const double eps = 1e-6;
33 
34 int maz[1005][1005];
35 int dx[]={1,0,0,-1};
36 int dy[]={0,1,-1,0};
37 bool OK;
38 int n,m;
39 int x1,y1,x2,y2;
40 bool check(int x,int y)
41 {
42     if(x<1 || x>n || y<1 || y>m)return false;
43     return true;
44 }
45 void dfs(int x,int y,int turn,int dire)
46 {
47     if(turn > 2 || !check(x,y))return;
48     if(OK)return ;
49     if(x == x2 && y == y2)
50     {
51         OK = 1;
52         return;
53     }
54     for(int i=0;i<4;i++)
55     {
56         if(dire + i == 3)continue;
57         int xx = x + dx[i];
58         int yy = y + dy[i];
59         if((xx != x2 || yy != y2) && maz[xx][yy] != 0)continue;
60         if(dire != i && dire != -1)dfs(xx,yy,turn + 1,i);
61         else dfs(xx,yy,turn,i);
62     }
63 }
64 
65 int main()
66 {
67     #ifndef ONLINE_JUDGE
68     freopen("in","r",stdin);
69     #endif
70     while(~scanf("%d%d",&n,&m),n,m)
71     {
72         for(int i=1;i<=n;i++)
73         {
74             for(int j=1;j<=m;j++)
75                 scanf("%d",&maz[i][j]);
76         }
77         int q;
78         scanf("%d",&q);
79         while(q--)
80         {
81             scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
82             if(maz[x1][y1] != maz[x2][y2]
83             || maz[x1][y1] == 0 || maz[x2][y2] == 0)
84             {
85                 puts("NO");
86                 continue;
87             }
88             OK=0;
89             dfs(x1,y1,0,-1);
90             if(OK)puts("YES");
91             else puts("NO");
92         }
93     }
94     return 0;
95 }
原文地址:https://www.cnblogs.com/fzf123/p/2744049.html