1. 程式人生 > >C語言陣列地圖求最近距離

C語言陣列地圖求最近距離

問題:假設有一張地圖,上面有著阻礙物,入口,出口。求出入口到出口的最短距離

在陣列中是這樣的:有一個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;
}