八皇后 求解。

Eric_SEU 2010-12-27 06:09:00
有错误,不知道怎么修改。。求助。
#include <iostream>
using namespace std;
bool cheak(int[][8],int ,int );
void queen(int [][8],int,int );
void show(int[][8] , int );
int k = 0;
int counter= 0;
int main()
{
int a[8][8]={0};

queen(a ,0,0);
cout<<"Finished!"<<endl;

cin.get();
cin.get();
return 0;
}

void queen (int a[][8], int i ,int j)
{




if(cheak(a, i, j))
{
a[i][j]=1;
k++;
cout << k << endl;

}
if(i<=7)
{
if(j<7)
{
queen(a,i ,j+1);

}
else
{
queen(a,i+1,0);

}
a[i][j]=0;

}

if(k==8 ||(i==7&&j==7))
{
if(k==8)
{
counter++;
show(a, 8);
cout<<"-------------------It's the No."<<counter<<"----------------"<<endl;
}
}





}

void show(int a[][8], int n )
{

for(int i=0; i<n ;i++)
{
for(int j=0 ;j<n ; j++)
{
if (a[i][j]==1)
cout<<"■";
else
cout<<"□";
}
cout<<endl;
}
}

bool cheak(int a[][8],int i,int j )
{
for(int m=0 ;m< 8 ; m++)
{
if(a[i][m]==1)
return false;
if(a[m][j]==1)
return false;
if(a[(i+m)%8][(j+m)%8]==1)
return false;
if(a[(i+m)%8][(j-m)%8]==1)
return false;

}
return true;
}

















...全文
101 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eric_SEU 2010-12-28
  • 打赏
  • 举报
回复
楼上的尽心了,但是有点不对。。 而且check函数本身有大问题 貌似没法改, 不过还是谢谢了。
Q532420370 2010-12-28
  • 打赏
  • 举报
回复
#include <iostream.h>
#include<stdio.h>
bool cheak(int[][8],int ,int );
void queen(int [][8],int,int );
void show(int[][8] , int );
int k = 0;
int counter= 0;
int main()
{
int a[8][8]={0};

queen(a ,0,0);
cout<<"Finished!"<<endl;

cin.get();
cin.get();
return 0;
}

void queen (int a[][8], int i ,int j)
{




if(cheak(a, i, j))
{
a[i][j]=1;
k++;
cout << k << endl;

}
if(i<=7)
{
if(j<7)
{
queen(a,i ,j+1);

}
else
{
queen(a,i+1,0);

}
a[i][j]=0;

}

if(k==8 ||(i==7&&j==7))
{
if(k==8)
{
counter++;
show(a, 8);
cout<<"-------------------It's the No."<<counter<<"----------------"<<endl;
}
}





}

void show(int a[][8], int n )
{

for(int i=0; i<n ;i++)
{
for(int j=0 ;j<n ; j++)
{
if (a[i][j]==1)
cout<<"■";
else
cout<<"□";
}
cout<<endl;
}
}

bool cheak(int a[][8],int i,int j )
{
for(int m=0 ;m< 8 ; m++)
{
if(a[i][m]==1)
return false;
if(a[m][j]==1)
return false;
if(a[(i+m)%8][(j+m)%8]==1)
return false;
if(a[(i+m)%8][(j-m)%8]==1)
return false;

}
return true;
}

lz大哥 看看对不
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 caizs566205 的回复:]
这位大哥太感谢了,有一点小问题, 但已经改好了,谢谢了。
[/Quote]
不用谢!楼主结贴
Eric_SEU 2010-12-27
  • 打赏
  • 举报
回复
这位大哥太感谢了,有一点小问题, 但已经改好了,谢谢了。
  • 打赏
  • 举报
回复
楼主看下!我帮你改了下!能够实现了!

你的问题有几个:
1、在cheak(应该是check吧!)函数检测有点问题!我改了下!注释也加了,你对照看看!
2、感觉逻辑上面有些问题!我是跟着你的逻辑走,发现越走越走不下去了!

有问题请提出!

#include <iostream>
using namespace std;
bool cheak(int[][8],int ,int );
void queen(int [][8],int);
void show(int[][8] , int );
int k = 0; //不知道拿着干什么,我没用了!
int counter= 0;
int main()
{
int a[8][8]={0};

queen(a ,0);
cout<<"Finished!"<<endl;

cin.get();
cin.get();
return 0;
}

void queen (int a[][8], int i)
{
for (int j = 0; j < 8; j++) // 对每一行依次检查
{
if(cheak(a, i, j))
{
a[i][j]=1;
queen(a, i+1);
a[i][j]=0;
}
}
if(i==7) // 到达最后一行后,就输出!
{
/*if(k==8)*/
{
counter++;
show(a, 8);
cout<<"-------------------It's the No."<<counter<<"----------------"<<endl;
}
}





}

void show(int a[][8], int n )
{

for(int i=0; i<n ;i++)
{
for(int j=0 ;j<n ; j++)
{
if (a[i][j]==1)
cout<<"■";
else
cout<<"□";
}
cout<<endl;
}
}

bool cheak(int a[][8],int i,int j )
{
for(int m = 0 ;m < i ; m++) // 检测已经排好的前i个皇后!看是否和前i个皇后冲突!
{
if(a[i][m]==1)return false; //纵向
if(a[m][j]==1)return false; //横向
}
for (int m = i-1, n = j-1; m >= 0 && n >= 0; m--, n-- )
if (a[m][n] == 1) return false;//斜左方
for (int m = i-1, n = j+1; m >= 0 && n < 8; m--, n++ )
if (a[m][n] == 1) return false;//斜右方
return true;
}

64,670

社区成员

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

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