提出詳細
ソースコード
import java.awt.Point;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Pandemic {
public static boolean inField(int x, int y, int width, int height) {
return x >= 0 && x <= width - 1 && y >= 0 && y <= height - 1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
File inFile = new File("F.txt");
BufferedReader reader = null;
FileReader fr = null;
File outFile = new File("result.txt");
BufferedWriter writer = null;
FileWriter fw = null;
try {
// リーダ生成
fr = new FileReader(inFile);
reader = new BufferedReader(fr);
// ライター生成
fw = new FileWriter(outFile);
writer = new BufferedWriter(fw);
// テストケース数を読み込み
int testCaseNum = Integer.parseInt(reader.readLine());
// テストケース毎に計算、出力
for (int i = 1; i <= testCaseNum; i++) {
String caseNumStr = "Case #" + i + ":";
String[] size = reader.readLine().split(" ");
int width = Integer.parseInt(size[0]);
int height = Integer.parseInt(size[1]);
FieldObject[][] field = new FieldObject[height][width];
List<FieldObject> nonInfectedPersons = new ArrayList<FieldObject>();
List<FieldObject> infectedPersons = new ArrayList<FieldObject>();
for (int y = 0; y < height; y++) {
String[] values = reader.readLine().split(" ");
for (int x = 0; x < width; x++) {
int state = Integer.parseInt(values[x]);
FieldObject obj = new FieldObject(state, x, y);
field[y][x] = obj;
switch (state) {
case 1:
nonInfectedPersons.add(obj);
break;
case 2:
infectedPersons.add(obj);
break;
default:
}
}
}
Integer passageDay = 0;
boolean increased = false;
while (true) {
boolean alive = passageDay != 0 && !increased;
if (nonInfectedPersons.isEmpty() || alive)
break;
increased = false;
FieldObject[] ipArray = infectedPersons.toArray(new FieldObject[0]);
for (FieldObject obj : ipArray) {
Point p = obj.getPoint();
for (int dy = -1; dy <= 1; dy++) {
for (int dx = -1; dx <= 1; dx++) {
int targetX = p.x + dx;
int targetY = p.y + dy;
if ((dx != 0 || dy != 0) && inField(targetX, targetY, width, height)) {
FieldObject targetObj = field[targetY][targetX];
if (targetObj.state == 0)
continue;
boolean wasInfected = targetObj.isInfected();
targetObj.infect();
boolean isInfected = targetObj.isInfected();
boolean increaseInfected = !(wasInfected && isInfected);
if (increaseInfected) {
nonInfectedPersons.remove(targetObj);
infectedPersons.add(targetObj);
increased = true;
}
}
}
}
}
passageDay++;
}
String result = nonInfectedPersons.isEmpty() ? passageDay.toString() : "ALIVE";
// 標準出力
System.out.println(caseNumStr);
System.out.println(result);
// テキストファイルとして書き込み処理
writer.write(caseNumStr);
writer.newLine();
writer.write(result);
writer.newLine();
}
// テキストファイルをフラッシュ
writer.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 各IOインスタンスのクローズ処理
try {
if (reader != null)
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (reader != null)
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (fr != null)
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (reader != null)
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class FieldObject {
// 0なら壁、1なら非感染者、2なら感染者
public int state;
Point p;
FieldObject(int state, int x, int y) {
this.state = state;
p = new Point(x,y);
}
public Point getPoint() {
return new Point(p);
}
public void infect() {
if (state == 1)
state = 2;
}
public boolean isInfected() {
return state == 2;
}
}
提出情報
提出出力結果
テストケース情報