C语言数组地图求最近距离

版权声明:本文为博主原创文章,可以转载,但必须注明来源。 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循环中限制它的赋值范围

重要思路:

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;
}
 

猜你喜欢

转载自blog.csdn.net/qq_40176716/article/details/83063121