這是一個棋牌遊戲公司的面試題,也許你也會遇到,看看吧!
/**
*面試題
騎士營救公主
騎士只能向右或者向下移動,遇到陷阱就死了,求騎士營救公主的所有路線,用你熟悉的語言編寫程序。本題由於只能向下和向右,所有他們的路徑長度都相同(每個格子長度相等)
解題:尋路, 最短路徑,找出所有路徑-
*/
如圖:
對應二維數組關係如圖:
程序源代碼:
struct {
int x;//路徑X軸座標
int y;//路徑Y軸座標
int dir;//路徑方向
}stack[120],path[120];
void goMG()
{
int row =8;//行數
int col =10;//列數
int maxSize =120;//棧最多元素個數
int mg[10][12]={ //一個迷宮,其四周要加上均爲1的外框
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1,0,1},
{1,0,0,0,0,1,0,0,0,0,0,1},
{1,0,0,1,0,0,0,0,1,0,0,1},
{1,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,0,1},
{1,0,1,0,0,0,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,1,0,0,1},
{1,0,1,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1}
};
int top = -1;///棧頂指針
int dir = -1;//方向 0向右走,1向下走,只能向右或者向下走
int i ,j,find;
int count =0;//統計找到的路線,路徑數計數
int minSize = maxSize;//最短路徑長度
mg[1][1] = -1;//初始結點進棧
top++;stack[top].x =1;stack[top].y=1;stack[top].dir=-1;
while (top > -1) {//棧不空時循環
i = stack[top].x; j =stack[top].y; dir =stack[top].dir;
if(i == row && j == col){//找到了出口,輸出路徑
printf("\n找到了一條路線:%d,長度爲:%d \n ", ++count, (top+1));
for(int k =0;k <= top; k++){
printf("(%d,%d) ",stack[k].x,stack[k].y);
if((k+1)%5 ==0){printf("\n");}//輸出時每5個結點換一行
}
if((top+1) < minSize){//記錄最短路徑
minSize = top +1;
for(int min =0; min <= top; min++){
path[min] =stack[min];
}
}
mg[stack[top].x][stack[top].y] = 0;//讓該位置變爲其他路徑的可走結點
//返回上一個節點,繼續查找其他的路徑
top--;
i = stack[top].x; j =stack[top].y; dir =stack[top].dir;
}
find = 0;
while (dir <2 && find ==0) {
dir++;
switch (dir) {
case0:
i =stack[top].x; j =stack[top].y+1;break;//右邊
case1:
i =stack[top].x+1; j =stack[top].y;break;//下邊
default:
break;
}
if(mg[i][j] ==0)
find =1;
}
if(find ==1){//找到了下一個可走結點
stack[top].dir = dir;//修改原棧頂元素的dir值
top++;//下一個可走結點進棧
stack[top].x = i;
stack[top].y = j;
stack[top].dir = -1;
mg[i][j] = -1;//把當前走的點賦值,標記爲已走過,避免重複走到該結點
}else{
mg[stack[top].x][stack[top].y] = 0;//讓該位置變爲其他路徑的可走結點
top--;//返回之前節點
}
}
printf("\n所有的路徑條數爲:%d \n",count);
//本題由於只能向下和向右,所有他們的路徑長度都相同
printf("最短路徑長度爲:%d \n",minSize);
printf("最短路徑爲:\n");
for (int k =0; k < minSize; k++) {
printf("(%d,%d)",path[k].x,path[k].y);
}
printf("\n");
}
部分輸出結果:
歡迎下方留言談論,或者加入QQ羣83459374交流!