单源点最短路径算法实现,要C/C++写的程序,

单源点最短路径算法实现,要C/C++写的程序,还要流程图。详细点,简单点...谢谢啊!程序写的好的话,分数还可以再加!

这个题目要用广度优先搜索。我曾经做过一个就是用这种算法的题目,需要用队列来写,你先看一下题目,是我校OJ上的题目。做一名聪明的CF玩家Time Limit:1000MS Memory Limit:65536K
Total Submit:49 Accepted:30 Description 作为计算机学院的学生,CF应该是大家都很熟悉的一款游戏。那么如果你是一个真正的CF玩家,不如来试下这道题目吧。
当你在CFing的时候,什么事情最让你郁闷呢,估计就是当你与敌人刚要开战的时候,发现自己没有子弹了吧^_^。这个时候最聪明的选择就是赶快回到老家去买子弹继续战斗。那么怎样回到老家需要的时间最短呢??
Input 输入的第一行有两个整数N,M分别表示的是地图的宽和长(1 =< M =< N <= 100),接下来的N行分别输入CF地图的具体情况。‘@’表示的是你现在所在的位置,‘#’表示的你老家的位置,‘X’表示的是敌人可能出现的位置,虽然是可能出现的位置,但是没有子弹的你显然不愿意冒险走这个位置,即使要节省时间。 ‘*’表示的是你可以放心走过的安全位置。Output 求出在保证安全的条件下从‘@’到老家‘#’所需要的最小时间并且输出,假设每走一步需要一个单位的时间,且你只能向上下左右四个方向走,并且不能走出CS地图的范围。如果通过安全的位置点无法到达老家,则输出“GAME OVER”Sample Input 5 5 ***XX *@XXX **XX# ***X* ***** Sample Output 8 这里起点在@,终点在#,X为不能走的点,只能上下左右移动,很单纯的单元路径最短路题目。 我曾经写的AC的代码,我给你发过来。 #include<stdio.h>
#include<algorithm>
#include<queue> using namespace std; int flag[105][105];
int start_x,start_y,end_x,end_y;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int m,n,loop;
struct node
{
int x,y,step;
}; int judge(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n)
return 1; return 0;
} void BFS(int a,int b)
{
int k,now_x,now_y;
queue<node>king;
node tiger1,tiger2;//两只老虎,两只老虎,跑得快跑得快。。。。
tiger2.x=a;
tiger2.y=b;
tiger2.step=0;
king.push(tiger2);
while(!king.empty())
{
tiger1=king.front();
king.pop();
if(tiger1.x==end_x&&tiger1.y==end_y)
{
loop=0;
printf("%d\n",tiger1.step);
break;
}
for(k=0;k<4;k++)
{
now_x=tiger1.x+dx[k];
now_y=tiger1.y+dy[k];
if(judge(now_x,now_y)&&flag[now_x][now_y])
{
flag[now_x][now_y]=0;
tiger2.x=now_x;
tiger2.y=now_y;
tiger2.step=tiger1.step+1;
king.push(tiger2);
}
}
}
} int main()
{
int i,j;
char map[105][105];
memset(flag,0,sizeof(flag));
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
scanf("%s",map[i]);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(map[i][j]=='@')
{
start_x=i;
start_y=j;
flag[i][j]=1;
}
else if(map[i][j]=='#')
{
end_x=i;
end_y=j;
flag[i][j]=1;
}
else if(map[i][j]=='*')
flag[i][j]=1;
}
loop=1;
flag[start_x][start_y]=0;
BFS(start_x,start_y);
if(loop)
printf("GAME OVER\n");
return 0;
} //学长说我这是典型的90后写法。//你看不懂的话就加我口口吧,510685263//希望采纳,谢谢!!
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答
大家正在搜