简单BFS+优先队列。
CODE:
#include <stdio.h>
#include <stdlib.h>
#include < string.h>
#include <queue>
using namespace std;
#define SIZE 21
#define INF 0x3f3f3f3f
const int dx[] = { 1, - 1, 0, 0};
const int dy[] = { 0, 0, - 1, 1};
char maze[SIZE][SIZE];
int Time[SIZE][SIZE];
int N, M;
int bx, by, ex, ey;
int tS, tP, tT;
struct node
{
friend bool operator< ( const node &a, const node &b) // 优先队列
{
return a.step > b.step;
}
int x, y;
int step;
}p, q;
int check( int r, int c)
{
if(maze[r][c] != ' @ ' && r >= 0 && c >= 0 && r < N && c < M)
return 1;
return 0;
}
int bfs()
{
priority_queue<node> Q;
p.x = bx; p.y = by;
p.step = 0;
Q.push(p);
while(!Q.empty())
{
p = Q.top();
Q.pop();
if(p.x == ex && p.y == ey)
{
if(maze[p.x][p.y] != ' @ ')
return p.step;
return - 1;
}
for( int i = 0; i < 4; i++)
{
q = p;
q.x += dx[i];
q.y += dy[i];
if(check(q.x, q.y))
{
if(maze[q.x][q.y] == ' . ' && (q.step+tS) < Time[q.x][q.y])
{
q.step += tS;
Q.push(q);
Time[q.x][q.y] = q.step;
}
if(maze[q.x][q.y] == ' T ' && (q.step+tT) < Time[q.x][q.y])
{
q.step += tT;
Q.push(q);
Time[q.x][q.y] = q.step;
}
if(maze[q.x][q.y] == ' # ' && (q.step+tP) < Time[q.x][q.y])
{
q.step += tP;
Q.push(q);
Time[q.x][q.y] = q.step;
}
}
}
}
return - 1;
}
int main()
{
int i, j;
int times = 0;
while(~scanf( " %d%d ", &N, &M))
{
scanf( " %d%d%d ", &tP, &tS, &tT);
getchar();
for(i = 0; i < N; i++)
{
for(j = 0; j < M; j++)
{
Time[i][j] = INF;
scanf( " %c ", &maze[i][j]);
}
getchar();
}
scanf( " %d%d%d%d ", &bx, &by, &ex, &ey);
printf( " Case %d: ", ++times);
int ans = bfs();
printf( " %d\n ", ans);
}
return 0;
}
#include <stdlib.h>
#include < string.h>
#include <queue>
using namespace std;
#define SIZE 21
#define INF 0x3f3f3f3f
const int dx[] = { 1, - 1, 0, 0};
const int dy[] = { 0, 0, - 1, 1};
char maze[SIZE][SIZE];
int Time[SIZE][SIZE];
int N, M;
int bx, by, ex, ey;
int tS, tP, tT;
struct node
{
friend bool operator< ( const node &a, const node &b) // 优先队列
{
return a.step > b.step;
}
int x, y;
int step;
}p, q;
int check( int r, int c)
{
if(maze[r][c] != ' @ ' && r >= 0 && c >= 0 && r < N && c < M)
return 1;
return 0;
}
int bfs()
{
priority_queue<node> Q;
p.x = bx; p.y = by;
p.step = 0;
Q.push(p);
while(!Q.empty())
{
p = Q.top();
Q.pop();
if(p.x == ex && p.y == ey)
{
if(maze[p.x][p.y] != ' @ ')
return p.step;
return - 1;
}
for( int i = 0; i < 4; i++)
{
q = p;
q.x += dx[i];
q.y += dy[i];
if(check(q.x, q.y))
{
if(maze[q.x][q.y] == ' . ' && (q.step+tS) < Time[q.x][q.y])
{
q.step += tS;
Q.push(q);
Time[q.x][q.y] = q.step;
}
if(maze[q.x][q.y] == ' T ' && (q.step+tT) < Time[q.x][q.y])
{
q.step += tT;
Q.push(q);
Time[q.x][q.y] = q.step;
}
if(maze[q.x][q.y] == ' # ' && (q.step+tP) < Time[q.x][q.y])
{
q.step += tP;
Q.push(q);
Time[q.x][q.y] = q.step;
}
}
}
}
return - 1;
}
int main()
{
int i, j;
int times = 0;
while(~scanf( " %d%d ", &N, &M))
{
scanf( " %d%d%d ", &tP, &tS, &tT);
getchar();
for(i = 0; i < N; i++)
{
for(j = 0; j < M; j++)
{
Time[i][j] = INF;
scanf( " %c ", &maze[i][j]);
}
getchar();
}
scanf( " %d%d%d%d ", &bx, &by, &ex, &ey);
printf( " Case %d: ", ++times);
int ans = bfs();
printf( " %d\n ", ans);
}
return 0;
}
CODE2:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <queue>
using namespace std;
const int SIZE = 21;
const int dx[] = { 1, - 1, 0, 0};
const int dy[] = { 0, 0, - 1, 1};
char maze[SIZE][SIZE];
int v[SIZE][SIZE];
int bx, by, ex, ey;
int tT, tS, tP;
int n, m;
struct node
{
friend bool operator< ( const node &a, const node &b) // 优先队列
{
return a.step > b.step;
}
int x, y, step;
}p, q;
void init()
{
memset(v, 0, sizeof(v));
tT = tS = tP = 0;
}
int check( int x, int y)
{
if(x >= 0 && x < n && y >= 0 && y < m && maze[x][y]!= ' @ ') return 1;
return 0;
}
int bfs()
{
priority_queue<node> Q;
if(bx == ex && by == ey) return 0;
p.x = bx; p.y = by; p.step = 0;
v[bx][by] = 1;
Q.push(p);
while(!Q.empty())
{
p = Q.top();
Q.pop();
if(p.x == ex && p.y == ey)
{
if(maze[p.x][p.y] != ' @ ')
return p.step;
return - 1;
}
for( int i = 0; i < 4; i++)
{
q = p;
q.x += dx[i];
q.y += dy[i];
if(check(q.x, q.y) && !v[q.x][q.y])
{
if(maze[q.x][q.y] == ' T ')
{
q.step += tT;
v[q.x][q.y] = 1;
Q.push(q);
}
if(maze[q.x][q.y] == ' . ')
{
v[q.x][q.y] = 1;
q.step += tS;
Q.push(q);
}
if(maze[q.x][q.y] == ' # ')
{
v[q.x][q.y] = 1;
q.step += tP;
Q.push(q);
}
}
}
}
return - 1;
}
int main()
{
int times = 0;
while(~scanf( " %d%d ", &n, &m))
{
init();
scanf( " %d%d%d ", &tP, &tS, &tT);
for( int i = 0; i < n; i++)
scanf( " %s ", maze[i]);
scanf( " %d%d%d%d ", &bx, &by, &ex, &ey);
printf( " Case %d: ", ++times);
int ans = bfs();
printf( " %d\n ", ans);
}
return 0;
}
#include <cstdlib>
#include <cstdio>
#include <queue>
using namespace std;
const int SIZE = 21;
const int dx[] = { 1, - 1, 0, 0};
const int dy[] = { 0, 0, - 1, 1};
char maze[SIZE][SIZE];
int v[SIZE][SIZE];
int bx, by, ex, ey;
int tT, tS, tP;
int n, m;
struct node
{
friend bool operator< ( const node &a, const node &b) // 优先队列
{
return a.step > b.step;
}
int x, y, step;
}p, q;
void init()
{
memset(v, 0, sizeof(v));
tT = tS = tP = 0;
}
int check( int x, int y)
{
if(x >= 0 && x < n && y >= 0 && y < m && maze[x][y]!= ' @ ') return 1;
return 0;
}
int bfs()
{
priority_queue<node> Q;
if(bx == ex && by == ey) return 0;
p.x = bx; p.y = by; p.step = 0;
v[bx][by] = 1;
Q.push(p);
while(!Q.empty())
{
p = Q.top();
Q.pop();
if(p.x == ex && p.y == ey)
{
if(maze[p.x][p.y] != ' @ ')
return p.step;
return - 1;
}
for( int i = 0; i < 4; i++)
{
q = p;
q.x += dx[i];
q.y += dy[i];
if(check(q.x, q.y) && !v[q.x][q.y])
{
if(maze[q.x][q.y] == ' T ')
{
q.step += tT;
v[q.x][q.y] = 1;
Q.push(q);
}
if(maze[q.x][q.y] == ' . ')
{
v[q.x][q.y] = 1;
q.step += tS;
Q.push(q);
}
if(maze[q.x][q.y] == ' # ')
{
v[q.x][q.y] = 1;
q.step += tP;
Q.push(q);
}
}
}
}
return - 1;
}
int main()
{
int times = 0;
while(~scanf( " %d%d ", &n, &m))
{
init();
scanf( " %d%d%d ", &tP, &tS, &tT);
for( int i = 0; i < n; i++)
scanf( " %s ", maze[i]);
scanf( " %d%d%d%d ", &bx, &by, &ex, &ey);
printf( " Case %d: ", ++times);
int ans = bfs();
printf( " %d\n ", ans);
}
return 0;
}