面試題七 C/C++ 騎士營救公主 騎士只能向右或者向下移動,遇到陷阱就死了,求騎士營救公主的所有路線-程序員面試題

這是一個棋牌遊戲公司的面試題,也許你也會遇到,看看吧!


/**

 *面試題 

 騎士營救公主

   騎士只能向右或者向下移動,遇到陷阱就死了,求騎士營救公主的所有路線,用你熟悉的語言編寫程序。

 本題由於只能向下和向右,所有他們的路徑長度都相同(每個格子長度相等)

  解題:尋路, 最短路徑,找出所有路徑-

 */


如圖:



對應二維數組關係如圖:



程序源代碼:


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交流!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章