UVA 11624-Fire!-BFS-
2016-03-31 18:33
495 查看
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28833
题意:就是找起点S到走出n*m格子外的最短时间
开始有一些Fire点,每单位时间会四处延伸
先预处理好每个格子最先着火的时间。
在bfs找最短路的基础上加多一个判断是否着火即可
复杂度(NM)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int min(int a,int b)
{return a<b?a:b;}
int max(int a,int b)
{return a>b?a:b;}
int r,c;
int stx,sty;
struct node
{
int x,y,t;
node(){}
node(int a,int b,int c){x=a,y=b;t=c;}
};
int ok=0;
char tm[1005][1005];
int vis[1005][1005]; //着火时间
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int visited[1005][1005]; //访问过
queue <node> q,que;
void fire()
{
while(!que.empty())
{
// printf("%d\n",que.size());
node tt=que.front();que.pop();
int x=tt.x;
int y=tt.y;
int cur=tt.t;
for (int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if (!(xx>=1&&xx<=r&&yy>=1&&yy<=c))continue;
if (tm[xx][yy]=='#')continue;
if (vis[xx][yy]!=-1) continue;
vis[xx][yy]=cur+1;
que.push(node(xx,yy,cur+1));
}
}
}
int main()
{
int t;cin>>t;
while(t--)
{
int i,j;
ok=0;
memset(vis,-1,sizeof vis);
memset(visited,0,sizeof visited);
cin>>r>>c;
for (i=1;i<=r;i++)
scanf("%s",tm[i]+1);
while(!que.empty()) que.pop();
for (i=1;i<=r;i++)
{
for (j=1;j<=c;j++)
{
if (tm[i][j]=='J') {stx=i,sty=j;}
if (tm[i][j]=='F') { que.push(node(i,j,0)); vis[i][j]=0; }
}
}
fire();
node st(stx,sty,0);
while(!q.empty()) q.pop();
q.push(st);
int flag=-1;visited[stx][sty]=1;
while(!q.empty())
{
node tp=q.front();
q.pop();
for (int i=0;i<4;i++)
{
int xx=tp.x+dx[i];
int yy=tp.y+dy[i];
if (!(xx>=1&&xx<=r&&yy>=1&&yy<=c))
{
flag=tp.t;break;
}
if (tm[xx][yy]=='#')continue;
if (vis[xx][yy]!=-1&&vis[xx][yy]<=tp.t+1)continue;
if (visited[xx][yy])continue;
q.push(node(xx,yy,tp.t+1));
visited[xx][yy]=1;
}
if (flag!=-1)break;
}
if (flag!=-1) printf("%d\n",flag+1);
else printf("IMPOSSIBLE\n");
}
return 0;
}
题意:就是找起点S到走出n*m格子外的最短时间
开始有一些Fire点,每单位时间会四处延伸
先预处理好每个格子最先着火的时间。
在bfs找最短路的基础上加多一个判断是否着火即可
复杂度(NM)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
const double pi=acos(-1.0);
double eps=0.000001;
int min(int a,int b)
{return a<b?a:b;}
int max(int a,int b)
{return a>b?a:b;}
int r,c;
int stx,sty;
struct node
{
int x,y,t;
node(){}
node(int a,int b,int c){x=a,y=b;t=c;}
};
int ok=0;
char tm[1005][1005];
int vis[1005][1005]; //着火时间
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int visited[1005][1005]; //访问过
queue <node> q,que;
void fire()
{
while(!que.empty())
{
// printf("%d\n",que.size());
node tt=que.front();que.pop();
int x=tt.x;
int y=tt.y;
int cur=tt.t;
for (int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if (!(xx>=1&&xx<=r&&yy>=1&&yy<=c))continue;
if (tm[xx][yy]=='#')continue;
if (vis[xx][yy]!=-1) continue;
vis[xx][yy]=cur+1;
que.push(node(xx,yy,cur+1));
}
}
}
int main()
{
int t;cin>>t;
while(t--)
{
int i,j;
ok=0;
memset(vis,-1,sizeof vis);
memset(visited,0,sizeof visited);
cin>>r>>c;
for (i=1;i<=r;i++)
scanf("%s",tm[i]+1);
while(!que.empty()) que.pop();
for (i=1;i<=r;i++)
{
for (j=1;j<=c;j++)
{
if (tm[i][j]=='J') {stx=i,sty=j;}
if (tm[i][j]=='F') { que.push(node(i,j,0)); vis[i][j]=0; }
}
}
fire();
node st(stx,sty,0);
while(!q.empty()) q.pop();
q.push(st);
int flag=-1;visited[stx][sty]=1;
while(!q.empty())
{
node tp=q.front();
q.pop();
for (int i=0;i<4;i++)
{
int xx=tp.x+dx[i];
int yy=tp.y+dy[i];
if (!(xx>=1&&xx<=r&&yy>=1&&yy<=c))
{
flag=tp.t;break;
}
if (tm[xx][yy]=='#')continue;
if (vis[xx][yy]!=-1&&vis[xx][yy]<=tp.t+1)continue;
if (visited[xx][yy])continue;
q.push(node(xx,yy,tp.t+1));
visited[xx][yy]=1;
}
if (flag!=-1)break;
}
if (flag!=-1) printf("%d\n",flag+1);
else printf("IMPOSSIBLE\n");
}
return 0;
}
相关文章推荐
- IOS开发系列--Objective-C之协议、代码块、分类
- 随机修改nginx端口脚本及思路
- 多级神经网络结构表达文档语义性能更好吗
- 二叉树的二叉链表存储
- Nito.AsyncEx 这个库
- Spark RDD系列----3. rdd.coalesce方法的作用
- 【bzoj3996】【TJOI2015】【线性代数】【最小割】
- CentOS7.2安装详细步骤
- KVM实例应用
- MATLAB中求矩阵非零元的坐标
- iOS开发之多线程
- Python debug —— invalid literal for int() with base 10
- 40多个Java多线程问题的原创总结
- 设计模式组合模式
- PYTHON-进阶-编码处理小结
- P2P理财需谨防披着“国资”外衣的狼
- 面试题74:机器人的运动范围
- CodeForces 366C-Dima and Salad【01背包】
- 自动检测iOS网络并可跳转至设置界面设置网络
- MySQL 正则表达式