0215-Pachimon Creature

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0215&lang=jp
動的計画法の初期化の位置を間違っていて、何度かWrong Answerをいただいた。


実装(C++/インクルード等省略)

#define MEMCLEAR(variable_d) memset(variable_d,0,sizeof(variable_d))
string MAP[1001];
int W,H;
//剰余計算(結果は0以上になる)
#define MOD(value1,value2) ((value1%value2)+value2)%value2
typedef unsigned int uint;
typedef pair<int,int> P;
P s,e;
vector<P> data[6];
const int INF = 0x10000000;
int DP[6][1001];
int dist(const P &a,const P &b){
	return abs(a.first-b.first)+abs(a.second-b.second);
}
void ClearDP(){
	int x,y;
	for(x=0;x<6;x++)
		for(y=0;y<1001;y++){
			DP[x][y]=INF;
		}
}
int main(){
	for(;scanf("%d%d",&W,&H),W;){
		for(int i=0;i<6;i++)
			data[i].clear();
		for(int i=0;i<H;i++){
			cin >> MAP[i];
			for(int j=0;j<W;j++){
				if(MAP[i][j]=='S'){
					s.first=i;s.second=j;
				}else if(MAP[i][j]=='G'){
					e.first=i;e.second=j;
				}else if(MAP[i][j]!='.'){
					data[MAP[i][j]-'0'-1].push_back(P(i,j));
				}
			}
		}
		dprintf("Start:%d,%d\n",s.first,s.second);
		dprintf("End:%d,%d\n",e.first,e.second);
		int m1,m2,resx,resy;
		resx=0;resy=INT_MAX;
		for(int start=0;start<5;start++){
			ClearDP();
			for(uint i=0;i<data[m1=((start+1)%5)].size();i++){
				DP[0][i]=dist(data[m1][i],s);
			}
			for(int j=2;j<5;j++){
				for(uint i=0;i<data[m1=((start+j)%5)].size();i++){
					for(uint k=0;k<data[m2=((start+j-1)%5)].size();k++){
						DP[j-1][i]=min(DP[j-1][i],dist(data[m1][i],data[m2][k])+DP[j-2][k]);
					}
				}
			}
			int res=0x7FFFFFFF;
			for(uint i=0;i<data[m1=((start+4)%5)].size();i++){
				res=min(res,DP[3][i]+dist(e,data[m1][i]));
			}
			if(res<resy){
				resy=res;
				resx=start+1;
			}
		}
		if(resy>99999)
			puts("NA");
		else
			printf("%d %d\n",resx,resy);
		fflush(stdout);
	}

	return 0;
}