我这简单的程序哪错了,为什么输出的是0,手工计算明明是正确的

来源:百度知道 编辑:UC知道 时间:2024/06/19 19:51:27
#include<iostream>
using namespace std;
int main()
{
int g[300][300]={0};
int pan[300][300];
int a,b,i,j,n,m,t,k,q;
cin>>n>>m>>i>>j;

g[i][j]=1;
g[i+2][j-1]=1;
g[i+2][j+1]=1;
g[i+1][j-2]=1;
g[i+1][j+2]=1;
g[i-1][j-2]=1;
g[i-1][j+2]=1;
g[i-2][j-1]=1;
g[i-2][j+1]=1;

for(int k=0;k<n;k++)
{
if(g[k][0]==0){
pan[k][0]=1;
}
}
for(int nk=0;nk<m;nk++){
if(g[0][nk]==0)
{
pan[0][nk]=0;}
}
for(a=1;a<n;a++)
for(b=1;b<m;b++)
{
if(g[a][b]==0)
{
pan[a][b]=pan[a-1][b]+pan[a][b-1]

明显是0啊……
双重for循环之后a,b的值都是6,然后pan[6][6]的值又没有改变过,所以肯定是初始值0啊~

肯定是 cout<<pan[a][b]<<endl;这一句错了,好好想一下for循环的过程啊:判断-执行-改变判断条件

补充:pan第一列不是全为1……

看起来你的程序像是洪泛式的累加
if(g[0][nk]==0)
{
pan[0][nk]=0;}
}
但是这句使边为0就不是累加了
再有
cout<<pan[a][b]<<endl;
这句指向了没有运算的点

还有就是你的前边的
g[i][j]=1;
g[i+2][j-1]=1;
g[i+2][j+1]=1;
g[i+1][j-2]=1;
g[i+1][j+2]=1;
g[i-1][j-2]=1;
g[i-1][j+2]=1;
g[i-2][j-1]=1;
g[i-2][j+1]=1;
这样是你的g的边界被赋值1,而使得由g值判断给pan复制出现了,有些边界单元未被初始化的情况。错误很严重。

不知道你这正确答案是17是怎么算出来的。我看了下源程序,数组g和pan的每个元素都是1或者是0,运行中又没有累积。那么输出的结果至多是0,1,2这三种。也许你某一个行代码粗心打错了吧。

为什么程序总是输出0呢,是因为你输出的时候,a=n,b=m,而pan[n][m]的值初始化为0,在程序中没有改变。而且你中间的过程有问题。
一句话:数组下表越界了。

我没有全看,你的i和j没有初始化吧。