乙個求迷宮入口到出口最近距離的程式

2021-06-06 16:30:49 字數 3685 閱讀 2203

本文給出乙個c/c++語言版的求迷宮入口到出口的最短路徑的程式。程式的大部分使用標準c語言編寫,包括

輸入和輸出。唯一用到c++庫的地方是使用stl了中的deque。迷宮的寬和高,迷宮矩陣,迷宮的入口和出口

等資料從檔案讀入。程式首先讀入迷宮資料,然後更新迷宮矩陣,並求出迷宮入口和出口之間的最短路徑,

並輸出最短路徑長度。

1. 迷宮的表示。

迷宮用結構體matrix來表示

包括迷宮矩陣,迷宮的寬,迷宮的高,迷宮入口的座標,迷宮出口的座標。

結構體定義如下:

typedef struct _step

step;

typedef struct _matrix

matrix;

開始時,迷宮矩陣的每乙個元素是0或-1,0表示可走,-1表示是牆,走不通。為了便於檢查是否越界,

即座標是否超過迷宮的範圍。在迷宮的4個邊增加了全-1資料,表示4堵牆。這樣,在任何時候,都不

會越界。下面的資料表示1個5×5的迷宮,增加了4堵牆後,實際寬度和高度變為7,迷宮變成1個7×7

的矩陣。在搜尋迷宮出口距入口的最近距離的過程中,需要修改矩陣相關元素的值。對所有和迷宮入

口相通的方格,其值被改為其距迷宮入口的最近距離。

-1, -1, -1, -1, -1, -1, -1,

-1,  0,  0,  0,  0,  0, -1,

-1, -1,  0, -1,  0, -1, -1,

-1,  0,  0, -1, -1, -1, -1,

-1,  0, -1,  0,  0,  0, -1,

-1,  0,  0,  0, -1,  0, -1,

-1, -1, -1, -1, -1, -1, -1,

2.演算法

迷宮的矩陣的每一方格可用三元組(x,y,d)來表示,x,y表示這個方格的座標,d表示這個方格距入口

的距離.

1.首先,將入口的座標(x,y,0),放入雙端佇列my_queue。

2. 接下來重複以下的過程,直到隊列為空

2.1.從佇列頭部取出乙個三元組(x0,y0,d)

2.2.從右,下,左,上四個方向搜尋,看能否有非-1的格仔

如果可找到乙個方格,其座標為(x,y),且這個方格不是入口點,則有3種情況

case 1.

新方格對應的矩陣元素是0,表明新的方格距迷宮入口的距離尚未標記。

則將新方格對應的矩陣元素設定為d+1,同時將三元組(x,y,d+1)入隊

case 2:

新方格的對應的矩陣元素的值》d+1,表明該新方格距迷宮入口的距離已經標記但不是最近的。

則將新方格對應的矩陣元素設定為d+1,同時將三元組(x,y,d+1)入隊 

case 3:

如果新的方格的對應的矩陣元素<= d+1,該位置距入口的距離已經標記,則不做處理

3.檢查出口對應的矩陣元素m[exit.x][exit.y]的值,如果為0,表示沒有一條路徑可走,否則列印出

口距入口的距離。

全部的**見下:

#include #include #include #include using namespace std;

#define max_width 30

#define max_height 30

typedef struct _step

step;

typedef struct _matrix

matrix;

matrix g_matrix= //初始化為乙個迷宮,程式也能從檔案中讀入迷宮資料

, ,

, ,

, ,

, },

7,7, //7行,7列,包括4堵牆

, //入口座標

//出口座標

};

static step s_shift=

, //向右走, x++, y 不變

, //向下走, x 不變, y++

, //向左走, x--, y不變

//向上走, x 不變, y--

};

void print_matrix(matrix* pmatrix) //列印迷宮資料,迷宮資料報含4堵牆

printf("\n");

} }

int search_min_distance(int matric[max_width+2][max_width+2], step entrance, step exit)

}} }

return matric[exit.x][exit.y];

} int readmatrix(char *file)

memset(&(g_matrix),0,sizeof(g_matrix));

fgets(line,sizeof(line)-1,fp);

sscanf(line,"%d %d",&x,&y); //讀入迷宮的行數和列數

if ( x>max_width || y>max_height)

g_matrix.width=x+2; //在4條邊增加4堵牆,故寬和高增加2

g_matrix.height=y+2;

for (j=0;j='0' && *p<='9'|| *p == '-')

if (j>=g_matrix.width-2)

break;

} }

fgets(line,sizeof(line)-1,fp);

//讀入入口的行座標和列座標,和出口的行座標,列座標

sscanf(line,"%d %d %d %d",&(g_matrix.entrance.x),&(g_matrix.exit.y),&(g_matrix.exit.x),&(g_matrix.exit.y));

fclose(fp); fp=null;

g_matrix.entrance.x++; //增加了一列是牆,故入口橫座標+1

g_matrix.entrance.y++; //增加了一行是牆,故入口縱座標+1

g_matrix.exit.x++; //增加了一列是牆,故入口橫座標+1

g_matrix.exit.y++; //增加了一列是牆,故入口縱座標+1

return 1;

}

int main()

printf("the original matrix is\n");

print_matrix(&g_matrix);

distance= search_min_distance(g_matrix.data,g_matrix.entrance,g_matrix.exit);

printf("the new matrix is\n");

print_matrix(&g_matrix);

printf("\nthe distance is %d\n",distance);

return 0;

}

hust1346 兩個線段的最近距離和最小距離

題意 給出兩個線段的端點,讓你求這兩條線段的最近距離和最遠距離。思路 最近距離只可能出現在端點到垂足或者端點到端點上,最長距離只會出現在端點到端點上。include include include include include include include include include inc...

python 求乙個矩陣的距離矩陣的方法

例 有行向量矩陣matrix,維度為 n行,d特徵長 我們要求個點之間的距離並構成乙個 n,n 距離矩陣,方法如下 主要用到 np.square np.add a,b 若b為行向量,將b加到前面的每一行上 若b為列向量,將b加到前面的每一列上 np.sum a,1 1 按列加,0 按行加 我們有 a...

求最大的數 二 利用委託改成乙個入口函式

利用委託 using system using system.collections.generic using system.io using system.linq using system.text using system.threading.tasks using system.xml 這...