本文共 1836 字,大约阅读时间需要 6 分钟。
/*有一只电子老鼠被困在如下图所示的迷宫中。这是一个12*12单元的正方形迷宫,
黑色部分表示建筑物,白色部分是路。电子老鼠可以在路上向上、下、左、右行走, 每一步走一个格子。现给定一个起点S和一个终点T,求出电子老鼠最少要几步从起点走到终点。 输入: 本题包含一个测例。在测例的第一行有四个由空格分隔的整数,分别表示起点的坐标S(x.y)和终点的坐标T(x,y)。从第二行开始的12行中,每行有12个字符,描述迷宫的情况,其中'X'表示建筑物,'.'表示路.输出:
输出一个整数,即电子老鼠走出迷宫至少需要的步数。输入样例:
2 9 11 8
XXXXXXXXXXXX X......X.XXX X.X.XX.....X X.X.XX.XXX.X X.X.....X..X X.XXXXXXXXXX X...X.X....X X.XXX...XXXX X.....X....X XXX.XXXX.X.X XXXXXXX..XXX XXXXXXXXXXXX 输出样例:28
*/// map1[x1][y1]='X' ;//走过之后变成黑格子就不用used了 !!!!!!!!!!!!!!!!!
// 走过之后变成了黑格子就不用used了
#include<iostream> #include<queue> using namespace std; int x1,y1,x2,y2; char map1[14][14]={0}; int step[14][14]={0}; queue <int> x; queue <int> y; void input(); void bfs(); int main() { input() ; //把地图输入进去 bfs() ; //广搜找答案并输出return 0 ;
} void input() //按照题意输入起点、终点的位置和地图 { int i , j ; cin >> x1 >> y1 >> x2 >> y2 ;for(i = 1 ; i <= 12 ; i++)
{ for(j = 1 ; j <= 12 ; j++) { cin >> map1[i][j] ; } } x.push(x1) ;//起点横坐标入队 y.push(y1) ;//起点纵坐标入队 step[x1][y1] = 0 ;//起点的步数是0}
void bfs()
{ while(1) /*这个题肯定会找到答案所以直接括号里填1让它一直跑到终点就OK了 可能empty更官方点吧 这句话是我的片面理解 其实我就是为了省事*/ {if(step[x2][y2] != 0) //找到答案直接output break 大功告成 该干啥干啥去
{ cout << step[x2][y2] << endl ;//每走一格步数加1所以走到终点的时候步数就会变为想得到的结果 break ; } x1=x.front(); x.pop(); y1=y.front(); y.pop(); map1[x1][y1]='X' ;//走过之后变成黑格子就不用used了!!!!!!!!!!!!!!!!!!!! //接下来按题意进行四个方向的暴力搜索 // 我个人觉得这题简单在不用判断越界 少了好多大于号小于号 // 因为这个map外面是一圈X包着 简单多了 if(map1[x1][y1 - 1] == '.') // 向上判断 { x.push(x1) ; y.push(y1 - 1) ; step[x1][y1 - 1] = step[x1][y1] + 1 ; } if(map1[x1][y1 + 1] == '.') // 向下判断 { x.push(x1) ; y.push(y1 + 1) ; step[x1][y1 + 1] = step[x1][y1] + 1 ; } if(map1[x1 - 1][y1] == '.') // 向左判断 { x.push(x1 - 1) ; y.push(y1) ; step[x1 - 1][y1] = step[x1][y1] + 1 ; } if(map1[x1 + 1][y1] == '.') // 向右判断 { x.push(x1 + 1) ; y.push(y1) ; step[x1 + 1][y1] = step[x1][y1] + 1 ; } } }转载地址:http://ncml.baihongyu.com/