AIZU ONLINE JUDGE (AOJ) - 0026 について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
vow256
記事: 13
登録日時: 4ヶ月前
連絡を取る:

AIZU ONLINE JUDGE (AOJ) - 0026 について

#1

投稿記事 by vow256 » 4ヶ月前

AIZU ONLINE JUDGE (AOJ) の 0026 に関して質問です。
問題に対し、以下のようなコードを作成しました。

コード:

#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
#include <string>
#include <sstream>
using namespace std;

#define Vint vector<int>
#define VVint vector<Vint>
#define Fsize() front().size()

int VVint_zero(VVint vv) {
	int num = 0;
	for (int i = 0; i < (int)vv.size(); i++) {
		for (int j = 0; j < (int)vv.Fsize(); j++) {
			if (vv[i][j] == 0) num++;
		}
	}
	return num;
}

int VVint_max(VVint vv) {
	int max = INT_MIN;
	for (int i = 0; i < (int)vv.size(); i++) {
		for (int j = 0; j < (int)vv.Fsize(); j++) {
			if (vv[i][j] > max) max = vv[i][j];
		}
	}
	return max;
}

int main() {
	int x, y, s;
	string str, str_x, str_y, str_s;
	VVint vec(10, Vint(10, 0));
	while (getline(cin, str)) {
		replace(str.begin(), str.end(), ',', ' ');
		istringstream iss(str);
		iss >> str_x >> str_y >> str_s;
		x = stoi(str_x);
		y = stoi(str_y);
		s = stoi(str_s);
		vec[y][x] += 1;
		if (s == 1 || s == 2 || s == 3) {
			if (y - 1 >= 0) vec[y - 1][x] += 1;
			if (y + 1 >= 0) vec[y + 1][x] += 1;
			if (x - 1 >= 0) vec[y][x - 1] += 1;
			if (x + 1 >= 0) vec[y][x + 1] += 1;
		}
		if (s == 2 || s == 3) {
			if (y - 1 >= 0 && x - 1 >= 0) vec[y - 1][x - 1] += 1;
			if (y - 1 >= 0 && x + 1 >= 0) vec[y - 1][x + 1] += 1;
			if (y + 1 >= 0 && x - 1 >= 0) vec[y + 1][x - 1] += 1;
			if (y + 1 >= 0 && x + 1 >= 0) vec[y + 1][x + 1] += 1;
		}
		if (s == 3) {
			if (y - 2 >= 0) vec[y - 2][x] += 1;
			if (y + 2 >= 0) vec[y + 2][x] += 1;
			if (x - 2 >= 0) vec[y][x - 2] += 1;
			if (x + 2 >= 0) vec[y][x + 2] += 1;
		}
	}
	cout << VVint_zero(vec) << endl;
	cout << VVint_max(vec) << endl;
	return 0;
}
コード自体は正答であることが分かったのですが、自動審判で以下のエラーが表示されました。
timeout: the monitored command dumped core 0.00user 0.00system 0:00.13elapsed 0%CPU (0avgtext+0avgdata 3024maxresident)k 0inputs+8outputs (0major+231minor)pagefaults 0swaps
単純に訳すると「監視対象のコマンドがある」みたいなことが書かれていますが、自分では問題箇所が分からないので指摘していただきたいです。

かずま

Re: AIZU ONLINE JUDGE (AOJ) - 0026 について

#2

投稿記事 by かずま » 4ヶ月前

vow256 さんが書きました:
4ヶ月前
コード自体は正答であることが分かったのですが、
範囲チェックが間違っていますよ。

if (y + 1 >= 0) ではなく、if (y + 1 < 10) でしょう。

10 x 10 の紙面の周りに幅 2の枠を付けると
範囲チェックは不要になります。

また、x、y、s の読み込みが大袈裟ですね。

私なら次のように書くでしょう。

コード:

#include <iostream>

int v[2+10+2][2+10+2];

int main()
{
	int x, y, s, n = 0, m = 0;
	char c;
	while (std::cin >> x >> c >> y >> c >> s) {
		x += 2, y += 2;
		v[y-1][x]++, v[y][x-1]++, v[y][x]++, v[y][x+1]++, v[y+1][x]++;
		if (s >= 2)
			v[y-1][x-1]++, v[y-1][x+1]++, v[y+1][x-1]++, v[y+1][x+1]++;
		if (s == 3)
			v[y-2][x]++, v[y+2][x]++, v[y][x-2]++, v[y][x+2]++;
	}
	for (int i = 0+2; i < 10+2; i++)
		for (int j = 0+2; j < 10+2; j++) {
			if (v[i][j] == 0) n++;
			if (v[i][j] > m) m = v[i][j];
		}
	std::cout << n << '\n' << m << '\n';
}

アバター
vow256
記事: 13
登録日時: 4ヶ月前
連絡を取る:

Re: AIZU ONLINE JUDGE (AOJ) - 0026 について

#3

投稿記事 by vow256 » 4ヶ月前

"2,5,3" の読み込みは "cin >> (int) >> (char) >> (int) ..." で良かったんですね。

コード:

replace(str.begin(), str.end(), ',', ' ');
istringstream iss(str);
iss >> str_x >> str_y >> str_s;
x = stoi(str_x);
y = stoi(str_y);
s = stoi(str_s);
一応このくだりを直したらエラーは消えてくれました。
それにしても二次元配列の範囲に 2 を加えるだけで条件分岐がいらなくなるとは…。
やはり発想も必要なんですね。もう少し頑張ります。
ご丁寧にありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る