菜鸟发问:8皇后多解之递归程序,栈溢出乎?内存泄露乎?
我写了个很丑的8皇后多解的递归程序,运行后只出现一部分正确解答,用循环
改成非递归,一切正常。请教高人,或曰栈溢出得清空,或曰内存泄露,到底如何解决???
相烦高手看看,程序很臭,见笑了
# include <iostream.h>
int mark[8][8];//标记每格,初始为0
int row[8];//row定义每行的位置,初始为0
void Mark(int r,int c)
{//放子后相应四个方向作记号
if(r<8&&c<8&&r>=0&&c>=0)
{ for(int i=0;i<8;i++)//竖行
mark[i][c]++;
for(i=0;i<8;i++)//横行
mark[r][i]++;
int j;
for(i=r,j=c;i<8&&j<8;i++,j++)//左上到右下
mark[i][j]++;
for(i=r,j=c;i>=0&&j>=0;i--,j--)
mark[i][j]++;
for(i=r,j=c;j>=0&&i<8;j--,i++)//右上到左下
mark[i][j]++;
for(i=r,j=c;i>=0&&j<8;i--,j++)
mark[i][j]++;
mark[r][c]-=5;//落子处记号多作,删去
}
}
void DeleteMark(int r,int c)
{//子抽掉后相应行列删去记号,对应同上
if(r<8&&c<8&&r>=0&&c>=0)
{ for(int i=0;i<8;i++)
mark[i][c]--;
for(i=0;i<8;i++)
mark[r][i]--;
int j;
for(i=r,j=c;i<8&&j<8;i++,j++)
mark[i][j]--;
for(i=r,j=c;i>=0&&j>=0;i--,j--)
mark[i][j]--;
for(i=r,j=c;j>=0&&i<8;j--,i++)
mark[i][j]--;
for(i=r,j=c;i>=0&&j<8;i--,j++)
mark[i][j]--;
mark[r][c]+=5;
}
}
void Search(int k)
{ if(mark[k][row[k]]==0)//空格,可放子
{ Mark(k,row[k]);//作记号
k++;//处理下一行
if(k>7)//到最后一行
{
for(int i1=0;i1<8;i1++)
cout<<i1<<" "<<row[i1]<<",";
cout<<endl; //输出结果
if(row[0]<=7) //第一行仍可后移进行处理
{ while(row[k]>=7&&k>0) //当前行棋子到了最后仍无解
{ k--; //到上一行
DeleteMark(k,row[k]); // 删除上一行相关记号
}
for(int l=k+1;l<8;l++)//重置下面所有行
row[l]=0;
row[k]++; //当前行再后移一格
Search(k);
}
else return;
}
else Search(k);
}
else //有子,转移到上一行
{ while(row[k]>=7&&k>0)//当前行棋子到了最后仍无解
{ k--;//到上一行
DeleteMark(k,row[k]);// 删除上一行相关记号
}
for(int l1=k+1;l1<8;l1++)//reset data below
row[l1]=0;//重置下面所有行
row[k]++;//当前行再后移一格
Search(k);
}
}
void Queen()
{ //初始记号都记为0
for(int i=0;i<8;i++)
{ row[i]=0;
for(int j=0;j<8;j++)
mark[i][j]=0;
}
int k=0;
int counts=0;
//调用递归函数
Search(k);
}
void main()
{ Queen();
}