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