本文給出乙個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 這...