ページ 11

JOI2010~2011年度の過去問の5問目について

Posted: 2011年11月12日(土) 17:12
by thkk0730
こんにちは

JOI公式サイトに掲載されている2010~2011年度の過去問の予選の第5問を解いたのですが
公式サイトに掲載されている判定用の入力1~5までを試したところ(コピペですが)正常だったので
AOJ(会津オンラインジャッジ)さまの方で同じ問題(AOJ0558)で、ジャッジしたところランタイムエラーが出ます。
私の環境(VC++2010の警告レベル最大)では、警告がでないので原因が良くわからなくて困っています。

読み辛いかもしれませんがよろしければご回答をお願い致します。

--コード--

コード:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <queue>

#define MAX 1001
#define OBJ 0
#define WAY 20000

int map[MAX][MAX];
int memo[MAX][MAX];

typedef struct list
{
	int step;
	int nh;
	int nw;
}list;

list lap( int step, int nh, int nw );

int main( void ){
	using namespace std;

	int H, W, N;

	while( cin >> H >> W >> N ){
		queue< list > que;
		int res = 0;
		int life = 1;

		memset( memo, -1, sizeof( memo ) );

		for( int i = 1 ; i <= H ; i ++ ){
			for( int j = 1 ; j <= W ; j ++ ){
				char tmp;

				cin >> tmp;

				if( tmp == 'S' ){
					que.push( lap( 0, i, j ) );
					map[i][j] = WAY;
				}
				else if( tmp == 'X' ){
					map[i][j] = OBJ;
				}
				else if( tmp == '.' ){
					map[i][j] = WAY;
				}
				else{
					map[i][j] = atoi( &tmp );
				}
			}
		}

		while( que.empty() != true ){
			list t = que.front();
			que.pop();

			if( map[t.nh][t.nw] == life ){
				life ++;
				map[t.nh][t.nw] = WAY;
				memset( memo, -1, sizeof( memo ) );
				while( que.empty() != true ) que.pop();
			}

			if( life == N+1 ){
				res = t.step;
				break;
			}
			if( memo[t.nh][t.nw] == -1 ) memo[t.nh][t.nw] = t.step;
			else if( memo[t.nh][t.nw] <= t.step ) continue;

			memo[t.nh][t.nw] = t.step;

			if( map[t.nh+1][t.nw] != OBJ ) que.push( lap( t.step+1, t.nh+1, t.nw ) );
			if( map[t.nh-1][t.nw] != OBJ ) que.push( lap( t.step+1, t.nh-1, t.nw ) );
			if( map[t.nh][t.nw+1] != OBJ ) que.push( lap( t.step+1, t.nh, t.nw+1 ) );
			if( map[t.nh][t.nw-1] != OBJ ) que.push( lap( t.step+1, t.nh, t.nw-1 ) );
		}

		cout << res << "\n";	
	}

	return 0;
}

list lap( int step, int nh, int nw )
{
	list tmp;

	tmp.step = step;
	tmp.nh = nh;
	tmp.nw = nw;

	return tmp;
}

Re: JOI2010~2011年度の過去問の5問目について

Posted: 2011年11月12日(土) 17:34
by xxx
座標が1000を超えて配列外を参照しています

MAXを1002あたりにすれば通ると思います.
( こういう場合は 1111 とか余裕を持った大きさにしておくといいです

Re: JOI2010~2011年度の過去問の5問目について

Posted: 2011年11月12日(土) 17:46
by thkk0730
ありがとうございます。

現在の座標がマイナスにならないようにするのだけに気を取られていて忘れていました・・・。
Accept出せたので解決にします。