解法
動的計画法じゃないかな?グラフにしたら勝った。バグ死してた。
ソース
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<cmath>
using namespace std;
#define INF ( 1 << 30 )
#define fr first
#define sc second
typedef pair < int , int > Pi;
typedef pair < Pi , Pi > Pii;
const int dy[] = { 0, 1, -1, 0}, dx[] = { 1, 0, 0, -1};
int h, w, Sx, Sy, Gx, Gy;
vector< Pi > hoge[5];
int dp[5][1000], num;
char c;
int dis(Pi x1,Pi x2){
return abs(x1.fr - x2.fr) + abs(x1.sc - x2.sc);
}
int rec(int now,int java){
if(dp[now][java]) return dp[now][java];
int ret = INF, next = ( now + 1 ) % 5;
if(now == num) ret = dis(hoge[now][java],Pi(Gy,Gx));
else for(int i = 0 ; i < hoge[next].size() ; i++ ){
ret = min( ret, rec( next, i) + dis(hoge[now][java],hoge[next][i]));
}
return dp[now][java] = ret;
}
int main(){
while(cin >> w >> h , w){
for(int i = 0 ; i < 5 ; i++ ) hoge[i].clear();
for(int i = 0 ; i < h ; i++ ){
for(int j = 0 ; j < w ; j++ ){
cin >> c;
if(c == 'S') Sy = i, Sx = j;
else if(c == 'G') Gy = i, Gx = j;
else if(c != '.') hoge[c-'1'].push_back(Pi(i,j));
}
}
Pi ret = Pi(INF,INF);
for(int i = 0 ; i < 5 ; i++ ){
for(int j = 0 ; j < 5 ; j++ )
for(int k = 0 ; k < 1000 ; k++ ) dp[j][k] = 0;
num = ( i + 4 ) % 5;
int next = ( i + 1 ) % 5, tmp = INF;
for(int j = 0 ; j < hoge[next].size() ; j++ ){
ret = min( ret, Pi(rec( next, j) + dis(Pi(Sy,Sx),hoge[next][j]), i+1));
}
}
if( ret.fr == INF ) cout << "NA" << endl;
else cout << ret.sc << " " << ret.fr << endl;
}
}
0 件のコメント:
コメントを投稿