标签:sample ace size -- style string out 输出 关系
代码:
#include<iostream> #include<algorithm> #include <stdio.h> #include <string.h> int a[1001][1001],vis[1001][1001]; int n,m,x1,x2,y1,y2,flag; using namespace std; void dfs(int x,int y,int d,int k)//d(1 up 2 down 3 left 4 right) { if(flag) return; if(k>=3) return; if(x<=0||y<=0||x>n||y>m) return;//此处x不是x轴! /* |-------->y | | | v x 读入顺序(愚昧的我)*/ if(x==x2&&y==y2)//如果找到了 ,flag设为1 { flag=1; return; } if(k==2)//如果已经折了两次,则当前直线必定经过目标点(废话),若不则返回。 { if(!(d==1&&x>x2&&y==y2||d==2&&x>x2&&y==y2||d==3&&y>y2&&x==x2||d==4&&y<y2&&x==x2)) return; } if(a[x][y]!=0) return;//如果非0为障碍,不能通过,返回 if(vis[x][y]) return;//如果已经经过了,返回 vis[x][y]=1;//标记为已经过 if(d==1)//现在向上走 { dfs(x-1,y,1,k); dfs(x+1,y,2,k+1);//方向改变了,k+1 dfs(x,y-1,3,k+1); dfs(x,y+1,4,k+1); } if(d==2)//现在向下走 { dfs(x-1,y,1,k+1); dfs(x+1,y,2,k); dfs(x,y-1,3,k+1); dfs(x,y+1,4,k+1); } if(d==3)//现在向左走 { dfs(x-1,y,1,k+1); dfs(x+1,y,2,k+1); dfs(x,y-1,3,k); dfs(x,y+1,4,k+1); } if(d==4)//现在向右走 { dfs(x-1,y,1,k+1); dfs(x+1,y,2,k+1); dfs(x,y-1,3,k+1); dfs(x,y+1,4,k); } vis[x][y]=0;//重新标记为未经过 } int main() { while(~scanf("%d%d",&n,&m)) { if(!n&&!m)//如果均为0 { break; } int i,j; for (i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } int t; scanf("%d",&t); while(t--) { flag=0; memset(vis,0,sizeof(vis)); scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1==x2&&y1==y2&&a[x1][y1]!=0)//如果在同一坐标则是错的 { printf("NO\n"); } else { if(a[x1][y1]==a[x2][y2]&&a[x1][y1])//不同点,要满足值相同且不为0 { dfs(x1-1,y1,1,0); dfs(x1+1,y1,2,0); dfs(x1,y1-1,3,0); dfs(x1,y1+1,4,0); if(flag) printf("YES\n"); else printf("NO\n"); } else printf("NO\n"); } } } }
标签:sample ace size -- style string out 输出 关系
原文地址:http://www.cnblogs.com/stxy-ferryman/p/7151162.html