#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
int a[3][3] = {
{1,0,0},
{0,2,0},
{0,0,0},
}; //建立一個3x3的迷宮,2代表墻,1表示起始點
int iplayer = 0;
int jplayer = 0; //起始下標
int ci = 0; //走出迷宮的次數
void show(int a[3][3]) //顯示二維陣列,也就是當前迷宮
{
printf("%d ---------------------\n", ++ci);
for (int i = 0;i < 3;i++)
{
for (int j = 0;j < 3;j++)
{
printf("%2d", a[i][j]);
}
printf("\n");
}
}
void AI(int a[3][3], int i, int j) //遞回走出迷宮
{
a[i][j] = 3; //走過的路
show(a); //顯示當前位置
if (i == 2 && j == 2) //找到出口
{
printf("you are win !\n");
return;
}
else
{
// 右,下,左,上
if (j + 1 <= 2 && a[i][j + 1] < 2)//向右走
{
AI(a, i, j + 1);
}
if (i + 1 <= 2 && a[i + 1][j] < 2)//向下走
{
AI(a, i + 1, j);
}
if (j - 1 >= 0 && a[i][j - 1] < 2)//向左走
{

AI(a, i, j - 1);
}
if (i - 1 >= 0 && a[i - 1][j] < 2)//向上走
{
AI(a, i - 1, j);
}
}
}
void main()
{
show(a);
AI(a, iplayer, jplayer);
system("pause");
}
uj5u.com熱心網友回復:
遞回return只是結束當前遞回層處理,然后回傳上一層的呼叫遞回的地方。如果你希望繼續結束上一層遞回,就要在上一層呼叫遞回的下一條陳述句做判斷,然后退出遞回。在你這個程式,可以把遞回的i,j引數用指標的方式傳入傳出,然后在呼叫遞回的下一條陳述句判斷i,j結束遞回。
uj5u.com熱心網友回復:
void AI(int a[3][3], int *i, int *j) //改成指標形式
{
a[*i][*j] = 3; //走過的路
show(a); //顯示當前位置
if (*i == 2 && *j == 2) //找到出口
{
printf("you are win !\n");
return;
}
else
{
// 右,下,左,上
if (*j + 1 <= 2 && a[*i][*j + 1] < 2)//向右走
{
//AI(a, i, j + 1);
*j += 1;
}
if (*i + 1 <= 2 && a[*i + 1][*j] < 2)//向下走
{
//AI(a, i + 1, j);
*i += 1;
}
if (*j - 1 >= 0 && a[*i][*j - 1] < 2)//向左走
{
//AI(a, i, j - 1);
*j -= 1;
}
if (*i - 1 >= 0 && a[*i - 1][*j] < 2)//向上走
{
//AI(a, i - 1, j);
*i -= 1;
}
AI(a, i, j); //遞回呼叫
if (*i==2 && *j==2) return; //遞回結束回傳到這里,然后判斷 i,j 退出遞回
}
}
uj5u.com熱心網友回復:
改成指標后仔細看了一下才發現,其實沒必要改成指標,因為遞回完本來就結束了所以你的問題是呼叫遞回的分支沒用else if,所以遞回結束后又進入了下一個if繼續遞回了
所以改成else if 就可以了
void AI(int a[3][3], int i, int j) //遞回走出迷宮
{
a[i][j] = 3; //走過的路
show(a); //顯示當前位置
if (i == 2 && j == 2) //找到出口
{
printf("you are win !\n");
return;
}
else
{
// 右,下,左,上
if (j + 1 <= 2 && a[i][j + 1] < 2)//向右走
{
AI(a, i, j + 1);
j += 1;
}
else if (i + 1 <= 2 && a[i + 1][j] < 2)//向下走
{
AI(a, i + 1, j);
}
else if (j - 1 >= 0 && a[i][j - 1] < 2)//向左走
{
AI(a, i, j - 1);
}
else if (i - 1 >= 0 && a[i - 1][j] < 2)//向上走
{
AI(a, i - 1, j);
}
}
}
uj5u.com熱心網友回復:
遞回有堆疊, return了當前堆疊,但是以前的東西得繼續,你可以把這個想象成編號,0->1->2這樣, N執行完畢了就執行N-1執行位置剩下,直到最上層完畢.uj5u.com熱心網友回復:
把向上走if (i - 1 >= 0 && a[i - 1][j] < 2)//向上走
{
AI(a, i - 1, j);
}
放在else里面試試
if (i == 2 && j == 2) //找到出口
{
printf("you are win !\n");
return;
}
else
{
// 右,下,左,上
if (j + 1 <= 2 && a[i][j + 1] < 2)//向右走
{
AI(a, i, j + 1);
}
if (i + 1 <= 2 && a[i + 1][j] < 2)//向下走
{
AI(a, i + 1, j);
}
if (j - 1 >= 0 && a[i][j - 1] < 2)//向左走
{
AI(a, i, j - 1);
}
if (i - 1 >= 0 && a[i - 1][j] < 2)//向上走
{
AI(a, i - 1, j);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/107165.html
標籤:C語言
上一篇:C語言資料結構與演算法
