C語言陣列地圖求最近距離
阿新 • • 發佈:2018-11-28
問題:假設有一張地圖,上面有著阻礙物,入口,出口。求出入口到出口的最短距離
在陣列中是這樣的:有一個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; }