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;
}