题目大意:
在一个迷宫内输出位置a到位置b的最短距离,以及一共有多少种不同的最短路径数。
分析:
在一个迷宫内输出位置a到位置b的最短距离,以及一共有多少种不同的最短路径数。
分析:
利用bfs可以计算出最短路径的距离(即移动次数),然后用dfs计算出等于(移动次数)时有多少种不同的最短路径。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int dr[] = { 0, -1, 0, 1};
const int dc[] = {-1, 0, 1, 0};
const int N = 500;
struct Node {
int r,c,dis;
Node() {}
Node(int _r,int _c,int _dis) {
r = _r;
c = _c;
dis = _dis;
}
Node(int _r,int _c) {
r = _r;
c = _c;
}
};
int n,m,k;
int tot,ans; //总共道路
char grid[N][N]; //图
int vis[N][N];//标记数组
int map[N][N];//用于标记长度
void dfs(int r,int c) {
if(grid[r][c] == 'S') {
tot++;
return ;
}
int x,y;
for(int i = 0; i < 4; i++) {
x = r + dr[i];
y = c + dc[i];
if(x < 1 || x > n || y < 1 || y > m ) {
continue;
}
if(map[x][y] == map[r][c] - 1) {
dfs(x,y);
}
}
}
int bfs(int p,int q) {
queue<Node> que;
que.push(Node(p,q,0));
memset(vis,0,sizeof(vis));
memset(map,-1,sizeof(map));
vis[p][q] = true;
map[p][q] = 0;
int r,c,dis;
while(!que.empty()) {
Node front = que.front();
que.pop();
for(int i = 0; i < 4; i++) {
r = front.r + dr[i];
c = front.c + dc[i];
dis = front.dis + 1;
if(vis[r][c] || r < 1 || r > n || c < 1 || c > m || grid[r][c] == '#') {
continue;
}
vis[r][c] = true;
map[r][c] = dis;
if(grid[r][c] == 'E') {
return dis;
}
que.push(Node(r,c,dis));
}
}
return -1;
}
int main() {
int x,y;
int p,q;
int r,s;
while(scanf("%d%d%d",&n,&m,&k) != EOF) {
memset(grid,'.',sizeof(grid));
for(int i = 0; i < k; i++) {
scanf("%d%d",&x,&y);
grid[x][y] = '#';
}
scanf("%d%d",&p,&q);
grid[p][q] = 'S';
scanf("%d%d",&r,&s);
grid[r][s] = 'E';
ans = bfs(p,q);
if(ans == -1) {
printf("No Solution!\n");
}else {
tot = 0;
dfs(r, s);
printf("%d\n",ans);
printf("%d\n",tot);
}
}
return 0;
}