Hatena::Grouptopcoder

hama_DU@TopCoderへの道

2010-02-13[過去問]Member SRM458(DIV2)

SRM458 div2 第一問(250点)

| SRM458 div2 第一問(250点) - hama_DU@TopCoderへの道 を含むブックマーク はてなブックマーク - SRM458 div2 第一問(250点) - hama_DU@TopCoderへの道

http://www.topcoder.com/stat?c=problem_statement&pm=10725

砂漠化の問題。


文字列のx番目を文字cに置き換える関数の自作が必要だったのを除けば、

特に工夫はしていません。あと、砂漠のマス目数が変わらなかったら処理を打ち切るなど。

public class Desertification {

	// 文字列のx番目を文字cに置き換え
	public static String setChar(String line, int x, char c) {
		return line.substring(0, x) + String.valueOf(c) + line.substring(x + 1);
	}

	public int desertArea(String[] island, int T) {
		int desertCells = 0, prev_desertCells = 0;
		int islandx = island[0].length(), islandy = island.length;

		String[] island_back = island.clone();
		for (int t = 0 ; t < T ; t++) {
			desertCells = 0;
			for (int y = 0 ; y < islandy ; y++) {
				for (int x = 0 ; x < islandx ; x++) {
					if (island[y].charAt(x) == 'F') {
						try {
							if (island[y-1].charAt(x) == 'D') {
								island_back[y] = setChar(island_back[y], x, 'D');
								desertCells++;
								continue;
							}
						} catch (Exception e) {}

						try {
							if (island[y].charAt(x-1) == 'D') {
								island_back[y] = setChar(island_back[y], x, 'D');
								desertCells++;
								continue;
							}
						} catch (Exception e) {}

						try {
							if (island[y].charAt(x+1) == 'D') {
								island_back[y] = setChar(island_back[y], x, 'D');
								desertCells++;
								continue;
							}
						} catch (Exception e) {}

						try {
							if (island[y+1].charAt(x) == 'D') {
								island_back[y] = setChar(island_back[y], x, 'D');
								desertCells++;
								continue;
							}
						} catch (Exception e) {}
					} else {
						desertCells++;
					}
				}
			}
			island = island_back.clone();
			if (prev_desertCells == desertCells) {
				break;
			}
			prev_desertCells = desertCells;
		}
		return desertCells;
	}
}

例外って便利ですね。