版权声明:本文为博主原创文章,可以转载,但必须注明来源。 https://blog.csdn.net/qq_40176716/article/details/83063121
问题:假设有一张地图,上面有着阻碍物,入口,出口。求出入口到出口的最短距离
在数组中是这样的:有一个8*8的数组,1障碍物 0路 3入口 4出口
1 1 1 1 1 1
1 3 1 1 1 1
1 0 0 0 0 1
1 1 0 0 1 1
1 1 1 0 1 1
1 1 1 0 4 1
这样的话输出:7
程序思路与步骤:一开始出入一个值赋值为i,再输入一个i*i的地图
因为i是变量,无法创建动态数组,所以我们建一个100*100的数组,在for循环中限制它的赋值范围
扫描二维码关注公众号,回复:
4277732 查看本文章
重要思路:
1.以3为始发点,遍历它上下左右的数,然后判断是否为路,若为路,则路的那个0变为5,
2.然后执行第二步,遍历数组,将所有的5变为3,在执行第一步
这样的话他会以水波类型的那种形式便利整个地图,然而,怎么判断出口呢?
我们先创建一个整型变量ok,默认为0;在main方法中加一个while循环执行1,2,这样:while(i!=1)
当3周围有出口4的时候,将ok变为1,循环结束
而最后的输出距离,则是有一个整型变量=0,在每次执行完2步骤时+1即可
代码:
/**
*莫言情难忘 1179307527
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n;
int ok=0;
int shu=0;
int shuzu[100][100];
void five(){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(shuzu[i][j]==5)
shuzu[i][j]=3;
}
}
}
void three(int i,int j)
{
//上
if(shuzu[i-1][j]==4)
ok=1;
if(i>=0 && shuzu[i-1][j]==0){
shuzu[i-1][j]=5;
}
//下
if(shuzu[i+1][j]==4)
ok=1;
if(i<n+1 && shuzu[i+1][j]==0){
shuzu[i+1][j]=5;
}
//左
if(shuzu[i][j-1]==4)
ok=1;
if(j>=0 && shuzu[i][j-1]==0){
shuzu[i][j-1]=5;
}
//右
if(shuzu[i][j]==4)
{ok=1;}
if(j<n+1 && shuzu[i][j+1]==0){
shuzu[i][j+1]=5;
}
}
int main(){
int i,j,p,q=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&shuzu[i][j]);
}
}
for(i=0;i<n;i++)//初始值
{
for(j=0;j<n;j++)
{
if(shuzu[i][j]==3)
{
p=i;q=j;}
}
}
while(ok!=1){
for(int t=0;t<n;t++){
for(int v=0;v<n;v++){
if(shuzu[t][v]==3)
three(t,v);
}
}
five();
shu++;
}
printf("%d",shu);
return 0;
}