「日常训练」 Fire!(UVA-11624)
与其说是训练不如说是重温。重新写了Java版本的代码。
import java.util.*;
import java.math.*;
import java.io.BufferedInputStream;
public class Main
{
static class Node
{
int r, c, t;
public Node(int _r, int _c)
{
this(_r, _c, 0);
}
public Node(int _r, int _c, int _t)
{
r=_r; c=_c; t=_t;
}
}
static int[][] fireTime = new int[1005][1005];
static int[][] maze = new int[1005][1005];
static Queue<Node> q = new LinkedList<>();
static final int[] dx = {0,1,0,-1};
static final int[] dy = {1,0,-1,0};
static int r, c;
static int startR, startC;
static void getFireTime()
{
for(int i=0;i<=r;++i)
for(int j=0;j<=c;++j)
fireTime[i][j]=0x3f3f3f3f;
while(!q.isEmpty())
{
Node node = q.poll();
fireTime[node.r][node.c] = node.t;
for(int i=0; i!=4; ++i)
{
int tr = node.r + dx[i],
tc = node.c + dy[i];
if(tr>=0 && tr<r && tc>=0 && tc<c && fireTime[tr][tc]>node.t+1 && maze[tr][tc]==1)
{
fireTime[tr][tc] = node.t+1;
q.offer(new Node(tr, tc, node.t+1));
}
}
}
}
static String solve()
{
Queue<Node> sq = new LinkedList<>();
boolean[][] vis = new boolean[1005][1005];
sq.offer(new Node(startR, startC));
vis[startR][startC]=true;
while(!sq.isEmpty())
{
Node now = sq.poll();
if(now.t>=fireTime[now.r][now.c]) continue;
if(now.r==0 || now.r == r-1 || now.c == 0 || now.c == c-1)
return String.valueOf(now.t+1);
for(int i=0;i!=4;++i)
{
int tr = now.r + dx[i],
tc = now.c + dy[i];
if(tr>=0 && tr<r && tc>=0 && tc<c && fireTime[tr][tc]>now.t+1 && (!vis[tr][tc]) && maze[tr][tc]==1)
{
vis[tr][tc]=true;
sq.offer(new Node(tr, tc, now.t+1));
}
}
}
return "IMPOSSIBLE";
}
public static void main(String args[])
{
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int T = cin.nextInt();
while(T-- != 0)
{
q.clear();
r = cin.nextInt();
c = cin.nextInt();
for(int i=0; i!=r; ++i)
{
String str = cin.next();
for(int j=0;j!=c;++j)
{
char chr = str.charAt(j);
if(chr == '#') maze[i][j] = 0;
else if(chr == '.') maze[i][j] = 1;
else if(chr == 'J')
{
maze[i][j] = 1;
startR=i; startC=j;
}
else if(chr == 'F')
{
maze[i][j] = 1;
q.offer(new Node(i,j));
}
}
}
getFireTime();
System.out.println(solve());
}
}
}
「日常训练」 Fire!(UVA-11624)的更多相关文章
- 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)
题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...
- 「日常训练」COMMON 约数研究(HYSBZ-1968)
题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...
- 「日常训练」 Mike and Fun (CFR305D2B)
题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- 「日常训练」Magic Stones(CodeForces-1110E)
题意 给定两个数组c和t,可以对c数组中的任何元素变换\(c_i\)成\(c_{i+1}+c_{i-1}-c_i\),问c数组在若干次变换后能否变换成t数组. 分析 这种魔法题目我是同样的没做过. ...
- 「日常训练」Jongmah(Codeforces-1110D)
题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...
- 「日常训练」The Necklace(UVA-10054)
代码 for(int i=0; i!=n; ++i) { int u = cin.nextInt(); int v = cin.nextInt(); edges.add(new Edge(u,v)); ...
- 「日常训练」Known Notation(ZOJ-3829)
题意与分析 题意是这样的:给一个字符串,字符串中只包含数字和运算符'*'.现在问字符串是不是一个合法的逆波兰式(后缀表达式).已知逆波兰式的空格消除,也就是说123可以看成123也可以看成1和23.如 ...
- 「日常训练」 Genghis Khan the Conqueror(HDU-4126)
题意 给定\(n\)个点和\(m\)条无向边(\(n\le 3000\)),需要将这\(n\)个点连通.但是有\(Q\)次(\(Q\le 10^4\))等概率的破坏,每次破坏会把\(m\)条边中的某条 ...
随机推荐
- 剑指offer 最小的k个数 、 leetcode 215. Kth Largest Element in an Array 、295. Find Median from Data Stream(剑指 数据流中位数)
注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...
- Python KafkaProducer and KafkaConsumer的开发模块
1.在python中往kakfa写数据和读取数据,使用的是python-kafka库 2.消费者需持续写入数据,因groupid存在偏移量,才能看看到数据. 3.安装库的命令为pip install ...
- Boost noncopyable实现禁止拷贝的类
在C++中定义一个类,如果不明确定义拷贝构造函数和拷贝赋值操作符,编译期会为我们自动生成这两个函数.但是我们有时又希望禁止拷贝类的实例,这时可以私有化拷贝构造函数和拷贝赋值操作符即可. class d ...
- HDFS的Write过程
hadoop中重要的组成部分HDFS,它所发挥的重要作用是进行文件的后端存储.HDFS针对的是低端的服务器,场景为读操作多.写操作少的情况.在分布式存储情况下,比较容易出现的情况是数据的损害,为了保证 ...
- 深入理解计算机系统——系统级I/O
一.UNIX I/O 在UNIX系统中有一个说法,一切皆文件.所有的I/O设备,如网络.磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行.这种将设备映射为文件的方式,允 ...
- CCF认证201803-2 碰撞的小球 java代码实现。
问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒. 当小球到达线 ...
- Java解析Excel之应用Reflection等技术实现动态读取
目录树 背景 技术选型 问题分析 技术要点及难点分析 源码分析 测试用例 背景 Tip:因为产品提的需求我都开发完了,进行了项目提测:前天老大走过来说:你用spring-boot开发一个解析Excel ...
- Oracle数据库sql语句
1.创建用户.赋权限.删除用户 create user test identified by test default test users temporary tablespace temp; gr ...
- Linux-- 查看文件 cat/tac
cat 查看文件 用法:cat 文件名 1.显示非空白行行号 -b 2.显示所有行号 -n 3.将[Tab]按键以 ^T 显示出来 -T 4.显示出特殊字符 -V 5.将结尾的断行字符$显示出来 -E ...
- 底层文件I/O操作中read()函数的缓存问题
最近在学习Linux过程中看到文件I/O操作这里时,文件I/O操作的系统调用涉及的5个函数:open(),read(),write(),lseek(),close().在一开始就阐明这些函数的特点是不 ...