首页 > 代码库 > HDU1175:连连看 [DFS]
HDU1175:连连看 [DFS]
题目链接:连连看
题意:
给出一张n*m的图,有q次询问,每次询问给出两个位置,问这两个位置是否能够相消
相消的条件:
1.两个位置可以用线相连且弯折度不超过2
2.两位置数字相同且不为0
分析:
用一个二维数组存储该位置的弯折度,注意剪枝顺序,详情见代码
一开始写dx[],dy[]的时候写成一维,却wa,不清楚为什么
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 int n,m,a[1010][1010],dx[5]={0,0,-1,0,1},dy[5]={0,1,0,-1,0},q,x1,y1,x2,y2,cnt,fang[1010][1010],flag; 7 8 void dfs(int x,int y,int cnt,int f) 9 {10 //注意剪枝的顺序11 if(flag) return ;//若已有结果,则直接返回12 if(x<1||y<1||x>n||y>m||cnt>2) return ;13 if((x==x2)&&(y==y2)) {flag=1;return ;}14 if(a[x][y]) return ;15 //若该点已有弯折度且当前局面到x,y的弯折度大于其他局面的弯折度,则返回16 if((fang[x][y]!=-1)&&(cnt>=fang[x][y])) return ;17 fang[x][y]=cnt;18 for(int i=1;i<=4;++i)19 {20 int xx=x+dx[i],yy=y+dy[i];21 if(f!=i) dfs(xx,yy,cnt+1,i);else dfs(xx,yy,cnt,i);22 }23 }24 25 int main()26 {27 while(scanf("%d%d",&n,&m)!=EOF)28 {29 if(n==0&&m==0) return 0;30 for(int i=1;i<=n;++i)for(int j=1;j<=m;++j) {scanf("%d",&a[i][j]);}31 for(scanf("%d",&q);q--;)32 {33 memset(fang,-1,sizeof(fang));34 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);35 flag=0;36 if(a[x1][y1]!=a[x2][y2]||a[x1][y1]==0) {puts("NO");continue;}37 fang[x1][y1]=0;38 for(int i=1;i<=4;++i) dfs(x1+dx[i],y1+dy[i],0,i);39 if(flag) puts("YES");else puts("NO");40 }41 }42 }
HDU1175:连连看 [DFS]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。