用回溯法递归求解八皇后问题出现debug error.求高人指点!!!

y1509713911 2011-10-15 05:13:00

//用回溯法递归求解八皇后问题。
#include <iostream>
using namespace std;

void init(bool *row,bool *diag,bool *bdiag,int n);
void show(int *x,int n);
void backtracking(bool *row,bool *diag,bool *bdiag,int *x,int c,int n);

void main()
{
int n,c=1;
cout<<"Input a integer:";
cin>>n;
bool *row=new bool[n];
bool *diag=new bool[2*n];
bool *bdiag=new bool[2*n];
int *x=new int[n];
init(row,diag,bdiag,n);
backtracking(row,diag,bdiag,x,c,n);
delete []row; //输出结果后,出现Debug error!
delete []diag;
delete []bdiag;
delete []x;
}

void backtracking(bool *row,bool *diag,bool *bdiag,int *x,int c,int n)
{
if(c>n)
show(x,n);
else
{
for(int r=1;r<=n;r++)
{
if(!row[r] && !diag[r+c-1] && !bdiag[n-c+r])
{
row[r]=diag[r+c-1]=bdiag[n-c+r]=true;
x[c]=r;
backtracking(row,diag,bdiag,x,c+1,n);
row[r]=diag[r+c-1]=bdiag[n-c+r]=false;
}
}
}
}

void show(int *x,int n)
{
static int i=1;
cout<<"The NO."<<i++<<" root is:(";
for(int j=1;j<=n;j++)
{
cout<<x[j];
if(j!=n)
cout<<',';
else cout<<')'<<endl;
}
}

void init(bool *row,bool *diag,bool *bdiag,int n)
{
for(int k=1;k<=n;k++)
row[k]=false;
for(k=1;k<=2*n;k++)
{
diag[k]=false;
bdiag[k]=false;
}
}

在线求高手给个解答!!!
...全文
133 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
y1509713911 2011-10-16
  • 打赏
  • 举报
回复
额,确实越界了。呵,很好!
y1509713911 2011-10-15
  • 打赏
  • 举报
回复

void init(bool *row,bool *diag,bool *bdiag,int n)
{
for(int k=1;k<=n;k++)//我已经加了等号啊。而且按你的改法,我试了,还是出现debug error!
row[k]=false;
for(k=1;k<=2*n;k++)
{
diag[k]=false;
bdiag[k]=false;
}
}


blingpro 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 y1509713911 的回复:]

为了使得程序合乎我们的生活习惯,我故意使得row[0]元素浪费掉的。所以元素下标从1开始我想应该没错吧。
[/Quote]

那就要这样定义了
bool *row=new bool[n+1]; //去掉第0,for(int i = 1;i<=n;i++)
bool *diag=new bool[2*n+1];
bool *bdiag=new bool[2*n+1];
y1509713911 2011-10-15
  • 打赏
  • 举报
回复
为了使得程序合乎我们的生活习惯,我故意使得row[0]元素浪费掉的。所以元素下标从1开始我想应该没错吧。
blingpro 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 y1509713911 的回复:]

引用 1 楼 zhujian888 的回复:
bool *row=new bool[n];


for(int k=1;k<=n;k++) // 越界了吧
row[k]=false;

for(int r=1;r<=n;r++)
{
if(!row[r] &amp;&amp; !diag[r+c-1] &amp;&amp; !bdiag[n-c+……
[/Quote]

for(int k = 0;k<n;k++);
....
for(int r = 0;r<n;r++);
y1509713911 2011-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhujian888 的回复:]
bool *row=new bool[n];


for(int k=1;k<=n;k++) // 越界了吧
row[k]=false;

for(int r=1;r<=n;r++)
{
if(!row[r] && !diag[r+c-1] && !bdiag[n-c+r])
[/Quote]
1楼能否解释下为什么会是越界?我搞不明白这个为甚么会是越界了.
zhujian888 2011-10-15
  • 打赏
  • 举报
回复
#include <iostream>
#include<time.h>

using namespace std;
static int pu[9][9]=
{
{0,0,0,7,2,8,0,0,0},
{0,9,0,0,5,1,6,0,0},
{0,0,0,0,6,0,0,8,2},
{3,0,0,8,0,2,7,0,4},
{1,7,4,0,3,0,0,2,0},
{2,8,0,5,0,0,0,3,0},
{0,1,0,3,0,0,2,0,0},
{0,0,7,0,4,6,0,0,5},
{0,0,6,1,0,0,0,4,9} };

int isvalid(const int i, const int j)
{
const int n = pu[i][j];
const static int query[] = {0, 0, 0, 3, 3, 3, 6, 6, 6};
int t, u;

for (t = 0; t < 9; t++)
if (t != i && pu[t][j] == n || t != j && pu[i][t] == n)
return 0;

for (t = query[i]; t < query[i] + 3; t++) //如果去掉此注释就可以对3*3的小格子进行验证,3*3小格子不重复1....9里数字
for (u = query[j]; u < query[j] + 3; u++)
if ((t != i || u != j) && pu[t][u] == n)
return 0;

return 1;
}

void output(void)
{
static int n;

cout << "Solution " << ++n << ":" <<endl;

for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++)
cout<< pu[i][j] << " ";
cout << endl;
}

cout << endl;
}

void work(const int n)
{
if (n == 81) {
output();
return;
}

const int i = n / 9, j = n % 9;

if (pu[i][j] != 0) {
work(n + 1);
return;
}

for (int k = 0; k < 9; k++) {
pu[i][j]++;
if (isvalid(i, j))
work(n + 1);
}

pu[i][j] = 0; //回溯
}

int main(void)
{
long start=clock();
work(0);
long end=clock();
cout<<"计算一共花了"<<(double)(end-start)<<"毫秒"<<endl;
return 0;
}
zhujian888 2011-10-15
  • 打赏
  • 举报
回复
bool *row=new bool[n];


for(int k=1;k<=n;k++) // 越界了吧
row[k]=false;

for(int r=1;r<=n;r++)
{
if(!row[r] && !diag[r+c-1] && !bdiag[n-c+r])

64,664

社区成员

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

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