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 }
by Farmer