菜鸟发问:8皇后多解之递归程序,栈溢出乎?内存泄露乎?

hzh_wolf 2001-09-30 07:52:05
我写了个很丑的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();
}
...全文
123 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sayu_yangyou 2001-12-30
  • 打赏
  • 举报
回复
no reaction, why?
sayu_yangyou 2001-12-24
  • 打赏
  • 举报
回复
你的程序太麻烦,我来写了一个,大家比比看:
/*你需要求N皇后问题,只需要把程序中的4替换成你需要的N就可以了。这个程序已经验证过了,直接运行。*/
#include <iostream.h>
void allocation(int i,int n);//分配位置
bool palace[4][4];//宫殿分布
int position[4];//保存位置进行比较
void main(){
int i,j;
//初始化
for (i=0;i<4;i++){
position[i]=-1;
for (j=0;j<4;j++) palace[i][j]=0;
}
allocation(0,4);
}

void allocation(int i,int n){
int j,k;
bool judge=1;
if (i>=n){
//分配成功,输出一种方案
cout<<"下面是一种方案:\n";
for (j=0;j<4;j++) {
for (k=0;k<4;k++){
if (palace[j][k]) cout<<"1 ";
else cout<<" ";
}
cout<<endl;
}
}
else {
for (j=0;j<n;j++){
palace[i][j]=1;
position[i]=j;
judge=1;
for (k=0;k<i;k++){
//如果k皇后还没有分配位置就不进行比较
if (position[k]<0) continue;
//判断新加入的皇后是否合乎要求
if ((position[k]==j)||((k+1==i)&&((position[k]+1==j)||(position[k]-1==j)))){
judge=0;
break;
}
}
//合乎要求进行下一个皇后的分配
if (judge) allocation(i+1,n);
//不合乎要求就回收位置,另外选一个位置重新分配
palace[i][j]=0;
position[i]=-1;
}
}
}
如果觉得有问题或者有想法,可以和我联络:sayu_yangyou@263.net
klhu 2001-10-03
  • 打赏
  • 举报
回复
冤枉!!!在我的机器上是没问题的,可能是tab键引起的缩进不认
chinakiss8848 2001-10-02
  • 打赏
  • 举报
回复
有一点我很清楚:虽然递归很费堆栈,但算八皇后问题是用不了多少的,只要程序没问题,是不可能缢出的!
chinakiss8848 2001-10-02
  • 打赏
  • 举报
回复
你们写程序,为什么不把格式写漂亮些呢?
对不住自己没关系,可要对的起别人啊!请用缩进格式!
先帮你把格式改好,等我有空再看看:
# 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)
{
int j=0;
for(j=0;j<8;j++)
{
if(mark[k][j]==0) //空格,可放子
{
row[k]=j;
Mark(k,j); //作记号
if(k>7) //到最后一行
{
for(int i1=0;i1<8;i1++)
cout<<i1<<" "<<row[i1]<<",";
cout<<endl; //输出结果
return;
}
Search(k+1);
DeleteMark(k,j);
}
}
}


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();
}


改得真累,记得下次写的时候就这样!这看起来清楚多了!

jt80 2001-10-02
  • 打赏
  • 举报
回复
高手,我不知道啊~
klhu 2001-10-02
  • 打赏
  • 举报
回复
就是在国际象棋棋盘上摆八个皇后,互相不被吃掉。问怎么摆?
Boolher 2001-10-02
  • 打赏
  • 举报
回复
请问八皇后的整个问题是怎样的?
klhu 2001-10-02
  • 打赏
  • 举报
回复
第归写错了


# 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)
{
int j=0;
for(j=0;j<8;j++)
{
if(mark[k][j]==0)//空格,可放子
{
row[k]=j;
Mark(k,j);//作记号
if(k>7)//到最后一行
{
for(int i1=0;i1<8;i1++)
cout<<i1<<" "<<row[i1]<<",";
cout<<endl; //输出结果
return;
}
Search(k+1);
DeleteMark(k,j);
}
}
}


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();
}
windindance 2001-10-02
  • 打赏
  • 举报
回复
栈溢出是递归经常遇到的问题.

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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