题目:http://acm.hdu.edu.cn/showproblem.php?pid=1175
大意:连连看规则,只能转两次弯,先输入矩阵0表示没有棋子,正整数表示不同的棋子,然后询问,输入两点坐标,判断能否消除。(询问没有先后顺序,都针对当前状态)
分析:dfs,普通迷宫搜索,加上判断转弯次数。
总结:看题仔细,继续加强dfs。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; #define N 1005 int dir[4][2]= {{-1,0},{0,1},{1,0},{0,-1}}; int map[N][N]; int vis[N][N]; int n,m; int flag=0; int a1,a2,b1,b2; bool inside(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m) return 1; return 0; } void dfs(int x,int y,int turn,int dire) { if(!inside(x,y)) return; if(turn-1>2) return; if(x==b1&&y==b2) { //cout<<turn<<‘*‘<<endl; flag=1; return; } if(flag==1) return; for(int i=0; i<4; i++) { int mx=x+dir[i][0]; int my=y+dir[i][1]; if(map[mx][my]==0&&!vis[mx][my]) { if(i!=dire) { vis[mx][my]=1; dfs(mx,my,turn+1,i); vis[mx][my]=0; } else { vis[mx][my]=1; dfs(mx,my,turn,dire); vis[mx][my]=0; } } } } int main() { int q; while(scanf("%d%d",&n,&m)!=EOF&&n&&m) { for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d",&map[i][j]); scanf("%d",&q); while(q--) { scanf("%d%d%d%d",&a1,&a2,&b1,&b2); if((map[a1][a2]!=map[b1][b2])||(map[a1][a2]==0||map[b1][b2]==0)) printf("NO\n"); else { flag=0; int tmp=map[a1][a2]; map[b1][b2]=0; memset(vis,0,sizeof(vis)); dfs(a1,a2,0,5); map[a1][a2]=map[b1][b2]=tmp; if(flag) printf("YES\n"); else printf("NO\n"); } } } return 0; }
时间: 2024-10-09 23:08:43