标签:queue tps cstring empty using max can printf uva
https://vjudge.net/problem/UVA-11624#author=zmyhh
通过 BFS 进行搜索,先搜索火到达 (x,y) 这个位置需要的最少时间,之后对 J 进行搜索,需要增加一些约束条件,可以走一些火还没有到达的位置或者火根本就不能到达的位置。
之后处理一下结果。
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 1e3+5;
int step[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
char s[maxn][maxn];
int vis[maxn][maxn];
int dis[maxn][maxn];
int n,m;
struct node{
int x,y,val;
};
node exnode(int x,int y,int val){
node vv;
vv.x=x;vv.y=y;vv.val=val;
return vv;
}
int slove(){
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
queue<node>q;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(s[i][j]==‘F‘){
q.push(exnode(i,j,1));
vis[i][j]=1;
}
}
}
while(!q.empty()){
node p=q.front();
q.pop();
for(int i=0;i<4;++i){
int xx=p.x+step[i][0];
int yy=p.y+step[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]!=‘#‘&&!vis[xx][yy]){
vis[xx][yy]=p.val+1;
q.push(exnode(xx,yy,p.val+1));
}
}
}
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(s[i][j]==‘J‘){
q.push(exnode(i,j,1));
dis[i][j]=1;
}
}
}
while(!q.empty()){
node p=q.front();
// printf("%d %d %d\n",p.x,p.y,p.val);
if(p.x==0||p.x==n-1||p.y==0||p.y==m-1){
return p.val;
}
q.pop();
for(int i=0;i<4;++i){
int xx=p.x+step[i][0];
int yy=p.y+step[i][1];
// printf("%d %d %d\n",xx,yy,vis[xx][yy]);
if(xx>=0&&yy>=0&&xx<n&&yy<m&&s[xx][yy]!=‘#‘&&!dis[xx][yy]&&(vis[xx][yy]>p.val+1||!vis[xx][yy])){
q.push(exnode(xx,yy,p.val+1));
dis[xx][yy]=p.val+1;
}
}
}
return -1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
scanf("%s",s[i]);
int res=slove();
if(res==-1)printf("IMPOSSIBLE\n");
else printf("%d\n",res);
}
return 0;
}
标签:queue tps cstring empty using max can printf uva
原文地址:https://www.cnblogs.com/VagrantAC/p/12771733.html