# include <queue>
# include <cstdio>
# include <cstring>
# include <iostream>
# include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int mmp[510][510],vis[510][510],use[510][510][4],d[4][2]={0,1,0,-1,-1,0,1,0};
int n,m,r1,r2,c1,c2;
struct Node{
int x,y,c,dest;
bool operator < (const Node a) const{
return a.c < c;
}
};
void bfs1()
{
int f = 0;
memset(vis,INF,sizeof(vis));
Node s;
priority_queue<Node> q;
s.x = r1;s.y = c1;s.c = mmp[r1][c1];
vis[r1][c1] = 0;
q.push(s);
while(!q.empty()){
Node tt;
tt = q.top();q.pop();
if(tt.x == r2 && tt.y == c2){
f = 1;
printf("%d ",tt.c);
break;
}
for(int i = 0;i < 4;i++){
Node t;
t.x = tt.x + d[i][0]; t.y = tt.y + d[i][1];
if(mmp[t.x][t.y] == -1) continue;
else t.c = tt.c + mmp[t.x][t.y];
if(t.x >= 0 && t.x < n && t.y >= 0 && t.y < m && vis[t.x][t.y] > t.c){
vis[t.x][t.y] = t.c;
q.push(t);
//printf("t :%d %d %d\n",t.x,t.y,t.c);
}
}
//printf("\n");
}
if(!f) printf("-1 ");
}
void bfs2()
{
int f = 0;
memset(use,INF,sizeof(use));
Node s; priority_queue<Node> q;
s.x = r1;s.y = c1;s.c = mmp[r1][c1];s.dest = -1;
use[s.x][s.y][0] = use[s.x][s.y][1] = use[s.x][s.y][2] = use[s.x][s.y][3] = 0;
q.push(s);
while(!q.empty()){
Node tt;
tt = q.top();q.pop();
//printf("tt :%d %d %d\n",tt.x,tt.y,tt.c);
if(tt.x == r2 && tt.y == c2){
f = 1;
printf("%d\n",tt.c);
break;
}
for(int i = 0;i < 4;i++){
if(tt.dest == i) continue;
Node t;
t.x = tt.x + d[i][0]; t.y = tt.y + d[i][1];
if(mmp[t.x][t.y] == -1) continue;
else t.c = tt.c + mmp[t.x][t.y];
if(t.x >= 0 && t.x < n && t.y >= 0 && t.y < m){
if(tt.dest == -1){
t.dest = i;
use[t.x][t.y][t.dest] = t.c;
q.push(t);
continue;
}
if(use[t.x][t.y][i] > t.c){
t.dest = i;
use[t.x][t.y][t.dest] = t.c;
q.push(t);
}
}
}
}
if(!f) printf("-1\n");
}
int main()
{
//freopen("a.txt","r",stdin);
//freopen("b.txt","r",stdin);
int k = 0;
while(~scanf("%d%d%d%d%d%d",&n,&m,&r1,&c1,&r2,&c2)){
r1--;r2--;c1--;c2--;
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++){
char num[4];
scanf("%s",num);
if(num[0] == '*') mmp[i][j] = -1;
else{
int x;
sscanf(num,"%d",&x);
mmp[i][j] = x;
}
}
// Êý¾ÝµÄÊä³ö;
// for(int i = 0;i < n;i++){
// for(int j = 0;j < m;j++){
// if(mmp[i][j] == -1) printf("* ");
// else printf("%d ",mmp[i][j]);
// }
// printf("\n");
// }
printf("Case %d: ",++k);
bfs1();
bfs2();
}
return 0;
}
简单的图论题-湖南省第十一届 省赛
最新推荐文章于 2022-08-09 14:27:00 发布