poj 3328
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
int n,m;
int map[61][31];
int sx[61],sy[31];
int end[61][31];
int top;
int d[2][61][31];
struct node{
int s,t;
int kind;
int weight;
friend bool operator <(node a,node b){
return a.weight>b.weight;
}
};
int v[2][61][31];
void solve(){
int i,j,k,s,t;
for(i=0;i<=1;i++)
for(j=1;j<=n;j++)
for(k=1;k<=m;k++)
d[i][j][k]=10000000;
memset(v,0,sizeof(v));
priority_queue<node> q;
node a;
for(i=1;i<=top;i++)
{
d[0][sx[i]][sy[i]]=0;
d[1][sx[i]][sy[i]]=0;
a.kind=0;
a.s=sx[i];
a.t=sy[i];
a.weight=0;
q.push(a);
a.kind=1;
q.push(a);
}
int ans=-1;
while(!q.empty())
{
a=q.top();
q.pop();
if(end[a.s][a.t])
{
if(ans==-1) ans=a.weight;
else ans=min(ans,a.weight);
continue;
}
if(v[a.kind][a.s][a.t]) continue;
v[a.kind][a.s][a.t]=1;
i=a.kind;
s=a.s;
t=a.t;
if(i==0)
{
for(j=max(1,s-2);j<=n&&j<=s+2;j++)
for(k=t+1;k<=m&&k<=t+3;k++)
if(abs(j-s)+abs(k-t)<=3&&map[j][k]!=-1)
{
if(d[1][j][k]>a.weight+map[j][k])
{
d[1][j][k]=a.weight+map[j][k];
node b;
b.kind=1;
b.s=j;
b.t=k;
b.weight=d[1][j][k];
q.push(b);
}
}
}
else
{
for(j=max(1,s-2);j<=s+2&&j<=n;j++)
for(k=max(1,t-3);k<=t-1;k++)
if(abs(j-s)+abs(k-t)<=3&&map[j][k]!=-1)
{
if(d[0][j][k]>a.weight+map[j][k])
{
d[0][j][k]=a.weight+map[j][k];
node b;
b.kind=0;
b.s=j;
b.t=k;
b.weight=d[0][j][k];
q.push(b);
}
}
}
}
cout<<ans<<endl;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
char c;
while(cin>>m>>n)
{
if(n==0&&m==0) return;
memset(end,0,sizeof(end));
top=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>c;
if(c=='X')
map[i][j]=-1;
if(c=='S')
{
map[i][j]=0;
sx[++top]=i;
sy[top]=j;
}
if(c=='T')
{
map[i][j]=0;
end[i][j]=1;
}
if(c>='1'&&c<='9')
map[i][j]=c-'0';
}
solve();
}
}
int main(){
read();
return 0;
}
#include<fstream>
#include<queue>
using namespace std;
int n,m;
int map[61][31];
int sx[61],sy[31];
int end[61][31];
int top;
int d[2][61][31];
struct node{
int s,t;
int kind;
int weight;
friend bool operator <(node a,node b){
return a.weight>b.weight;
}
};
int v[2][61][31];
void solve(){
int i,j,k,s,t;
for(i=0;i<=1;i++)
for(j=1;j<=n;j++)
for(k=1;k<=m;k++)
d[i][j][k]=10000000;
memset(v,0,sizeof(v));
priority_queue<node> q;
node a;
for(i=1;i<=top;i++)
{
d[0][sx[i]][sy[i]]=0;
d[1][sx[i]][sy[i]]=0;
a.kind=0;
a.s=sx[i];
a.t=sy[i];
a.weight=0;
q.push(a);
a.kind=1;
q.push(a);
}
int ans=-1;
while(!q.empty())
{
a=q.top();
q.pop();
if(end[a.s][a.t])
{
if(ans==-1) ans=a.weight;
else ans=min(ans,a.weight);
continue;
}
if(v[a.kind][a.s][a.t]) continue;
v[a.kind][a.s][a.t]=1;
i=a.kind;
s=a.s;
t=a.t;
if(i==0)
{
for(j=max(1,s-2);j<=n&&j<=s+2;j++)
for(k=t+1;k<=m&&k<=t+3;k++)
if(abs(j-s)+abs(k-t)<=3&&map[j][k]!=-1)
{
if(d[1][j][k]>a.weight+map[j][k])
{
d[1][j][k]=a.weight+map[j][k];
node b;
b.kind=1;
b.s=j;
b.t=k;
b.weight=d[1][j][k];
q.push(b);
}
}
}
else
{
for(j=max(1,s-2);j<=s+2&&j<=n;j++)
for(k=max(1,t-3);k<=t-1;k++)
if(abs(j-s)+abs(k-t)<=3&&map[j][k]!=-1)
{
if(d[0][j][k]>a.weight+map[j][k])
{
d[0][j][k]=a.weight+map[j][k];
node b;
b.kind=0;
b.s=j;
b.t=k;
b.weight=d[0][j][k];
q.push(b);
}
}
}
}
cout<<ans<<endl;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
char c;
while(cin>>m>>n)
{
if(n==0&&m==0) return;
memset(end,0,sizeof(end));
top=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
cin>>c;
if(c=='X')
map[i][j]=-1;
if(c=='S')
{
map[i][j]=0;
sx[++top]=i;
sy[top]=j;
}
if(c=='T')
{
map[i][j]=0;
end[i][j]=1;
}
if(c>='1'&&c<='9')
map[i][j]=c-'0';
}
solve();
}
}
int main(){
read();
return 0;
}