递归函数,变量定义在全局出错,局部正确

清晨曦月
博客专家认证
2020-07-21 06:12:42
情况,这是一个NOIP的问题,做这个题的时候发现一个问题,TX和TY如果定义为全局变量,在DEVC++中会非法操作,在VS中虽然不出错但是结果不正确,但如果定义为局部变量,就不会出现问题,出错代码如下:

#include<iostream>
#include<memory.h>
using namespace std;

int arr[11][11]={0};
int t,n,m,x,y,tx,ty,cnt=0; //***********************
//x在前
int dir[8][2]={{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2}};
//点x,点y,计数
void Dfs(int x,int y,int ans){ //重命名了 ,但是局部变量优先级高于全局,代码逻辑没错误
if(ans==m*n){
cnt++;
}else{
for(int i=0;i<8;i++){
tx=x+dir[i][0]; //**************
ty=y+dir[i][1]; //**************
if(tx>=0 && tx<n && ty>=0 && ty<m && arr[ty][tx]!=1){ //m, 打成n了
arr[ty][tx]=1;
Dfs(tx,ty,ans+1);
arr[ty][tx]=0;
}
}
}
}

int main(){
cin>>n>>m>>x>>y;
memset(arr, 0, sizeof(arr));
cnt=0;
arr[y][x]=1; //1=走过
Dfs(x,y,1);
cout<<cnt<<endl;
return 0;
}


如果把这两个变量定义为局部变量,就可以得到正确结果:

#include<iostream>
#include<memory.h>
using namespace std;

int arr[11][11]={0};
int t,n,m,x,y,cnt=0;
//x在前
int dir[8][2]={{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2}};
//点x,点y,计数
void Dfs(int x,int y,int ans){ //重命名了 ,但是局部变量优先级高于全局,代码逻辑没错误
if(ans==m*n){
cnt++;
}else{
for(int i=0;i<8;i++){
int tx=x+dir[i][0]; //未知问题,变量定义在这里使用栈空间就没问题了.
int ty=y+dir[i][1]; //占用全局变量空间就会发生错误
if(tx>=0 && tx<n && ty>=0 && ty<m && arr[ty][tx]!=1){ //m, 打成n了
arr[ty][tx]=1;
Dfs(tx,ty,ans+1);
arr[ty][tx]=0;
}
}
}
}

int main(){
cin>>n>>m>>x>>y;
memset(arr, 0, sizeof(arr));
cnt=0;
arr[y][x]=1; //1=走过
Dfs(x,y,1);
cout<<cnt<<endl;
return 0;
}


测试数据:5 4 0 0,
正确结果:32
...全文
110 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 2020-07-21
  • 打赏
  • 举报
回复
引用 2 楼 qybao 的回复:
很明显,定义成全局变量 tx=x+dir[i][0] //这里的tx ... Dfs(tx,ty,ans+1);//执行递归后 arr[ty][tx]=0; //这里的tx和上面的tx不同 而定义成局部变量,上面的两处tx是相同的 这么明显的区别,不用再多说了吧
懂了。结贴。
qybao 2020-07-21
  • 打赏
  • 举报
回复
很明显,定义成全局变量 tx=x+dir[i][0] //这里的tx ... Dfs(tx,ty,ans+1);//执行递归后 arr[ty][tx]=0; //这里的tx和上面的tx不同 而定义成局部变量,上面的两处tx是相同的 这么明显的区别,不用再多说了吧
Simple-Soft 2020-07-21
  • 打赏
  • 举报
回复
调试一下看看,就知道了

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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