题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175
题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以消掉。还有一个要注意的地方的就是转弯。转弯的次数不超过两次,这两个棋子才可以在棋盘上消去~
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int sx,sy,bx,by,wan,dir[4][2]= {0,1,0,-1,1,0,-1,0},n,m; 6 int vis[1110][1110],a[1110][1110],flag; 7 8 void dfs(int x,int y,int wan,int fang) 9 { 10 if (flag==1) 11 return ; 12 if (wan==2&&x!=bx&&y!=by) 13 return ; 14 if (wan>2) 15 return ; 16 for (int i=0; i<4; i++) 17 { 18 int X=x+dir[i][0]; 19 int Y=y+dir[i][1]; 20 if (X==bx&&Y==by) 21 //printf ("Yes\n"); 22 { 23 flag=1; 24 return ; 25 } 26 if (X>0&&X<=n&&Y>0&&Y<=m&&!vis[X][Y]&&a[X][Y]==0) 27 { 28 vis[X][Y]=1; 29 if (fang!=i) 30 dfs(X,Y,wan+1,i); 31 else 32 dfs(X,Y,wan,i); 33 vis[X][Y]=0; 34 } 35 36 } 37 } 38 39 int main () 40 { 41 while (~scanf("%d%d",&n,&m)) 42 { 43 if (n==0&&m==0) 44 break; 45 for (int i=1; i<=n; i++) 46 for (int j=1; j<=m; j++) 47 cin>>a[i][j]; 48 int k; 49 cin>>k; 50 while (k--) 51 { 52 flag=0; 53 memset(vis,0,sizeof(vis)); 54 cin>>sx>>sy>>bx>>by; 55 if (a[sx][sy]!=a[bx][by]||(a[sx][sy]==0||a[bx][by]==0)) 56 printf ("NO\n"); 57 else 58 { 59 dfs(sx,sy,-1,-1); 60 if (flag==1) 61 printf ("YES\n"); 62 else 63 printf ("NO\n"); 64 } 65 } 66 } 67 return 0; 68 }
hdu 1175 连连看 (深搜),布布扣,bubuko.com
时间: 2024-09-29 14:27:48