Codeforces #35 (div2) B "Warehouse"

問題:http://www.codeforces.com/contest/35/problem/B

ラクティス.

n×mのサイズの棚があって,x,yの区画に物を入れる命令がくる.一つの区画には一つの物しか入らないので右,右,右,下の段に飛んで一番左から,右,右,右のように見ていって最初に空いてる区画に物を入れる.一番右下まで見ても空いてなかったら何もしない.(一番左上を見に行ったりしない)で,指定された物がある場所を求める.
本番では,調査する区画のサイズをn*mではなくn+mと書き間違えるという失態によりテストケース8でWA.また,試しに右下まで空いてなかったときに左上を見にいく実装にしてみたらテストケース23でWA.

import java.io.*;
import java.util.*;

public class B_Warehouse {
	public static void main(String[] args) throws Exception {
		File in = new File("input.txt"), out = new File("output.txt");
		Scanner s;
		PrintWriter pw;
		if (in.exists()) {
			s = new Scanner(in);
			pw = new PrintWriter(out);
		} else {
			s = new Scanner(System.in);
			pw = new PrintWriter(System.out);
		}
		int n = s.nextInt(), m = s.nextInt(), q = s.nextInt();
		String[] shelf = new String[n * m + 1];
		for (; q-- > 0;) {
			if (s.next().equals("+1")) {
				int x = s.nextInt() - 1, y = s.nextInt() - 1;
				int i = x * m + y;
				while (i < n * m && shelf[i] != null) { // 正:n*m 誤:n+m
					++i;
				}
				shelf[i] = s.next();
			} else {
				String str = s.next(), result = "-1 -1";
				for (int i = 0; i < n * m; ++i) {
					if (str.equals(shelf[i])) {
						result = ((i / m + 1) + " " + (i % m + 1));
						shelf[i] = null;
						break;
					}
				}
				pw.println(result);
			}
		}
		pw.close();
	}
}