为什么C++代码在OJ输出全为0,本地编译运行可得到正确结果
问题原因
- 核心错误:
memset函数用法错误memset按字节对内存赋值,你传入的第二个参数'false'是多字节字符常量,实际取值非0,执行后flagx、flagy两个bool数组的所有元素都会被初始化为true,导致dfs中放置棋子的判断条件!flagx[x] && !flagy[y]永远不成立,全局变量ans不会被累加,因此输出始终为0。本地运行正常属于未定义行为的随机表现,不同编译器的内存处理逻辑不同才会出现本地和OJ运行结果不一致的情况。 - 次要错误:输入读取逻辑不严谨
while(scanf("%d %d",&n,&k))未判断读取是否成功,当输入流结束时scanf返回EOF(值为-1),会导致程序进入死循环。 - 逻辑瑕疵:
memset操作放在了终止条件判断之前,输入-1 -1时会执行无意义的内存初始化操作。
修正后的代码
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; int n,k,ans=0; char g[100][100]; bool flagx[100],flagy[100]; void dfs(int x,int y,int use) { if(use==k) { ans++; return ; } if(y==n) y=0,x++; if(x==n) return; //不放 dfs(x,y+1,use); //放 if(x>=0&&x<n&&y>=0&&y<n&&g[x][y]=='#'&&!flagx[x]&&!flagy[y]) { flagx[x]=true; flagy[y]=true; dfs(x,y+1,use+1); flagx[x]=false; flagy[y]=false; } } int main() { // 修改1:判断scanf成功读取2个参数才进入循环 while(scanf("%d %d",&n,&k) == 2) { if(n==-1&&k==-1) break; // 修改2:memset移到终止判断之后,第二个参数改为0对应bool的false memset(flagx,0,sizeof(flagx)); memset(flagy,0,sizeof(flagy)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>g[i][j]; dfs(0,0,0); cout<<ans<<endl; ans=0; } return 0; }
内容的提问来源于stack exchange,提问作者Jack Sun
相关产品推荐
相关产品推荐

