递归骑士周游的问题(麻烦谢谢)

xiethree 2016-08-02 10:56:16
是这样的
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
bool qz(int [][8],int,int,int [],int [],int [],int [],int);
void printer(int [][8],int [],int [],int);
void printer1(int [][8],int,int,int [],int [],int);


int main(void)
{
int row=3,col=4; //马初始坐标
int a[8][8]={0}; //二维棋盘数组
int b[65]={0},c[65]={0}; //记录每一步走的通的x,y坐标
int h[8]={2,1,-1,-2,-2,-1,1,2}; //马逆进针要走的水平值
int v[8]={-1,-2,-2,-1,1,2,2,1}; //马逆进针要走的垂直值
int value=1; //当前步数
a[row][col]=1; //棋盘上的位置置1
b[value]=row;c[value]=col; //记录第一个坐标
printer1(a,row,col,b,c,value); //显示第一个验证

b[value]=row;c[value]=col; //记录第一步x,y坐标值
bool flag=qz(a,row,col,b,
c,h,v,value);
printer(a,b,c,value);
return 0;
}

bool qz(int a[][8],int row,int col,int b[],int c[],int h[],int v[],int value)
{
if(value==64) return true;
bool flag;
int frow=0,fcol=0;
for(int i=0;i<8;++i)
{
frow=row+v[i];fcol=col+h[i];
if(frow<8 && fcol<8 && frow>=0 && fcol>=0 && a[frow][fcol]==0)//要走的位置是否在棋盘内?
{
value++; //步数+1
row=frow;col=fcol; //马移动走的通的位置
b[value]=row;c[value]=col; //记下马走的通的坐标
a[row][col]=1; //把马当前位置在棋盘上位置位置置1
printer1(a,frow,fcol,b,c,value);
flag=true;

//把相关坐标当参数调用自已
flag=qz(a,row,col,b,c,h,v,value);
cout<<row<<" "<<col <<endl; //运行这里row和col变成0

}
else
{
frow=row;fcol=col;
}

}

if(i>=8) //如果运行这里表示当前坐标8个方向都走不通
{
row=b[value-1];col=c[value-1]; //还原前一个坐标
}

}


void printer(int a[][8],int b[],int c[],int value)
{
for(int i=1;i<65;i++)
{
cout<<"步骤 "<<i<<" =["<<b[i]<<","<<c[i]<<"]"<<endl;
}
}


void printer1(int a[][8],int frow,int fcol,int b[],int c[],int value)
{
cout<<"row="<<frow<<" "<<"col="<<fcol<<endl;
cout<<"步骤 "<<value<<" =["<<b[value]<<","<<c[value]<<"]"<<endl;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;++j)
{
cout<< a[i][j]<<" ";
}
cout<<endl;
}

cout<<endl;
}



发现当第26步时出错,我添加58-61行代码认为可以这样返回重新修改row和col值为2,1,当跟踪时又变成0了 如图
,第58-61行时不是把row 和col改成2和1再传回去吗怎么返回时又变成0了
...全文
660 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36975308 2018-07-17
  • 打赏
  • 举报
回复
第26步要重置回0
赵4老师 2016-08-03
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
赵4老师 2016-08-03
  • 打赏
  • 举报
回复
请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢?
xiethree 2016-08-03
  • 打赏
  • 举报
回复
赵4老师在吗,问一下,如果走到第26步时把其对应棋盘数组上值置1,然后测试发现8个方向都走不通,要退回到第25步坐标判断后续前,那第26步当时棋盘数组置1值要不要重新改成0(谢谢)
xiethree 2016-08-03
  • 打赏
  • 举报
回复
谢谢我是用printer1每走一步都显示整个数组来对比
xiethree 2016-08-02
  • 打赏
  • 举报
回复
晕,传值和传址区别吧,我再回去想想怎么解决。。。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧