這是乙個網格迷宮問題,地圖的左上角為(0
,0) ,座標(i
,j) 表示
i 行
j 列。有乙個人,他在乙個迷宮裡,他要去乙個目標位置。他站在網格的交叉點上,障礙物在網格內部。他可以用不同的速度前進,每秒可以走
1 格到
3 格。也可以花費一秒的時間向左或向右轉。同時他不能撞到障礙物,也不能半個身體在地圖外面。現在,他最短要多少秒才能走到目標位置。人的體積是乙個半徑為
0.5 格的圓。
題目有多組測試資料。每組包含以下內容:
第一行包含兩個整數n,
m(0≤
n,m≤
50)。表示地圖的行數和列數。n,
m 為0 0
時表示結束。
接下來n
行,每行包含
m 個
0 或
1 的整數。
1 表示障礙物,
0 表示沒有障礙物。
接下來一行包含
5 個整數,x1
,y1,
x2,y
2,w 。分別表示初始位置和目標位置,以及初始方向。0、
1、2、
3 分別表示上右下左。
題目保證輸入合法。
輸出僅包含乙個整數,如果無解輸出-1
,否則輸出最短的時間(單位:秒)。
sample input
sample output
9 100 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 2
9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 2
0 0
12樣例如圖所示:(藍色點為出發點,紅色點為目標點,紅線為路徑)12
狀態:1.向左轉
2.向右轉
3.向此時的方向走1步
4.向此時的方向走2步
5.向此時的方向走3步
bfs
#include #include #include #include using namespace std;
int n,m;
int map[55][55];
bool vis[4][55][55];
struct node
for (int i=-1; i<4; i++)
if(i==0)
if(!vis[now.dr][now.x][now.y])
}else
if(next.dr==1) //向右走
if(next.dr==2) //向下走
if(next.dr==3) //向左走
//走i步過程中有一步走不通就不得行了
if(!judge(next.x, next.y) || map[next.x][next.y]==1)
if(!vis[next.dr][next.x][next.y])}}
}return -1;
}int main()
}if(j>=1)}}
}}
scanf("%d%d%d%d%d",&s.x,&s.y,&e.x,&e.y,&s.dr);
s.x--,s.y--,e.x--,e.y--;
s.step=0;
printf("%d\n",bfs());
}return 0;
}
乙個走迷宮的程式
本文給出乙個c語言版的走迷宮的程式。迷宮的寬和高,迷宮矩陣,迷宮的入口和出口從檔案讀入。程式首先讀入迷宮資料,然後顯示迷宮矩陣,最後呼叫迷宮搜尋程式找到乙個路徑,並輸出。1.迷宮的表示。迷宮用結構體matrix來表示 包括迷宮矩陣 迷宮的寬,迷宮的高,迷宮入口的座標,迷宮出口的座標。結構體定義如下 ...
乙個簡單的verlig程式 乙個簡單C程式的介紹
我們前面學了c語言的一些理論知識,今天通過乙個簡單的程式先來看一看c語言程式是什麼樣子。然後再對程式中的 進行介紹。這個語句的功能是進行有關的預處理操作。include稱為檔案包含命令,後面尖括號的內容稱為標頭檔案或首檔案。此處指包含stdio.h系統標頭檔案,在下面主函式中使用的printf 函式...
乙個簡單的Timer
關於system pause 的作用是暫停一下程式,等待按回車鍵繼續執行下一語句,類似getchar 的作用,不改變程式流程 system是呼叫dos的命令列,你還可以呼叫其他的命令,比如 system md d wang 這就是呼叫dos命令中的md命令,在d盤的根目錄下建立乙個資料夾,名字為wa...