当前位置: 代码迷 >> 综合 >> hdu oj-1175-连连看
  详细解决方案

hdu oj-1175-连连看

热度:4   发布时间:2023-12-19 11:37:08.0

无奈了,终于把这道题目A了,一天了~~~~

标记好变量,注意四个方向有各自的标记。

当这个方向的visit已经被标记了,那么就不走这里。

还有就是多练练STL的应用。




#include <iostream>
#include <queue>
#include<stdio.h>
#include <cstring>
using namespace std;
struct list 
{int x;int y;int turn;int time;
}s,l;
queue<list>ss;
int a[4] = {0, -1, 0, 1};
int b[4] = {1, 0, -1, 0};
int map[1002][1002];
int visit[1002][1002][4];
int step,i;
int n,m;
int check(int x, int y)
{if(x < 1 || x > n || y < 1 || y > m)return 0;elsereturn 1;
}
void bfs(int x1,int y1,int x2,int y2)
{while(!ss.empty())ss.pop();s.x=x1;s.y=y1;s.turn=0;s.time=-1;ss.push(s);
memset(visit,0,sizeof(visit));while(!ss.empty()){s=ss.front();ss.pop();if(s.x==x2&&s.y==y2){printf("YES\n");return;}for(i=0;i<4;i++){if(!check(s.x+a[i], s.y+b[i]) || visit[s.x][s.y][i])continue;if(map[s.x+a[i]][s.y+b[i]]==0||(s.x+a[i]==x2&&s.y+b[i]==y2)){if(s.time==i)step=s.turn;elsestep=s.turn+1;if(step<4){visit[s.x][s.y][i]=1;l.x=s.x+a[i];l.y=s.y+b[i];l.turn=step;l.time=i;ss.push(l);}}}}printf("NO\n");
}
int main()
{int x1,x2,y1,y2,i,j,q;while(scanf("%d%d",&n,&m)&&(m||n)){memset(map,0,sizeof(map));for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&map[i][j]);scanf("%d",&q);while(q--){scanf("%d%d%d%d",&x1,&y1,&x2,&y2);if(map[x1][y1]==map[x2][y2]&&map[x1][y1]!=0&&map[x2][y2]!=0)bfs(x1,y1,x2,y2);elseprintf("NO\n");}}return 0;
}