算法PK系列(2)-- 八皇后变种

r11222 2010-03-17 03:05:12
大家都知道,八皇后是把 8 个皇后放在 8*8 的棋盘

现在的问题变成,N个 (N<=8) 皇后,放入8*8的棋盘,输出所有可能的方法!(就是所有皇后不能互相攻击,不清楚规制的请百度)

例如

N=2,

就是两个皇后放在8*8 的棋盘,输出 所有可能


最重要是高效! 高效!!高效!!!!!!!!


大家都来发表意见吧,哈哈!!

分数不多,惭愧了
...全文
198 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
super_chris 2010-04-03
  • 打赏
  • 举报
回复
如果N<8,
那么每一层除了在本层选择一个位置外,还有一个选择就是空出本层。
其它一如N=8的情况。
LZ不知我说的对否?
r11222 2010-03-23
  • 打赏
  • 举报
回复
唉。还是靠自己解决了。结贴、、、
r11222 2010-03-23
  • 打赏
  • 举报
回复
顶。。。。。。。

。。
。。。
r11222 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mlee79 的回复:]

偶所知的现在最快的:

http://www.jsomers.com/nqueen_demo/nqueens.html
[/Quote]


这个不是我想要的,你的是N个皇后放在N*N表格
我想要的是N个皇后,放在8*8表格(N<8)

跪求
mLee79 2010-03-17
  • 打赏
  • 举报
回复
偶所知的现在最快的:

http://www.jsomers.com/nqueen_demo/nqueens.html

taodm 2010-03-17
  • 打赏
  • 举报
回复
因为8皇后改N皇后就应该是一、二行的改动量。
如果改不了,表明你对8皇后还掌握不够。
r11222 2010-03-17
  • 打赏
  • 举报
回复
顶.…为什么没人回答呢???
r11222 2010-03-17
  • 打赏
  • 举报
回复
跪求答案,说说你的想法,或者告诉我怎样修改八皇后的算法从而得到 N皇后的算法
SWJTUli 2010-03-17
  • 打赏
  • 举报
回复
显然不行
r11222 2010-03-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zyqde_0802 的回复:]

define 一个N值,把8改为N应该就行了吧
[/Quote]

这样不行的
zyqde_0802 2010-03-17
  • 打赏
  • 举报
回复
define 一个N值,把8改为N应该就行了吧
r11222 2010-03-17
  • 打赏
  • 举报
回复
我不是要八皇后啊...我会八皇后啊,我要是N皇后,随意的皇后数,嘻嘻。。。。
zyqde_0802 2010-03-17
  • 打赏
  • 举报
回复
//八皇后问题的实现
#include <iostream>
#include <conio.h>

using namespace std;

unsigned int sysSum=0;

//QueenChess类声明
class QueenChess
{
public:
QueenChess();
void Solve(); //求解八皇后问题,并给出放置成功的棋盘总个数
bool SafeJudge(int row,int col)const; //判断位置(row,col)是否安全
void PlaceQueen(int row); //在第row行放置一个皇后
private:
int chessState[8][8]; //用于存放棋盘状态
int sum; //八个皇后放置成功的棋盘解的总个数
};


QueenChess::QueenChess()
{
sum=0;
int i=0,j=0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
chessState[i][j]=0;
sysSum++;
}
sysSum++;
}
}

//求解八皇后问题能放置成功的棋盘总个数
void QueenChess::Solve()
{
//从第0行开始放置皇后
PlaceQueen(0);
cout<<"八皇后问题总共的解的个数是:"<<sum;
cout<<endl;
}

//在第row行的各列放置皇后
void QueenChess::PlaceQueen(int row)
{
for(int col=0;col<8;col++)
{
if(SafeJudge(row,col))
{
chessState[row][col]=1;
if(row<7)
PlaceQueen(row+1);
else
{
sum++;
}
}
sysSum++;
}
int i=0;
for(i=0;i<8;i++)
{
chessState[row][i]=0;
sysSum++;
}
}

//判断是否(row,col)是安全位置
bool QueenChess::SafeJudge(int row,int col)const
{
int qRow,qCol;
int i;

//检查前面各行,看与前面的皇后是否发生冲突
for(qRow=0;qRow<row;qRow++)
{
for(i=0;i<8;i++)
{
if(chessState[qRow][i]==1)
{
qCol=i;
//break;
}
sysSum++;
}

//如果两个皇后在同一行、同一列或两条对角线上,则说明该位置不安全
if(qRow==row||qCol==col||(qCol-qRow)==(col-row)||(qCol+qRow)==(col+row))
return false;
sysSum++;
}
return true;
}

效率不高,抛砖引玉了


int main()
{
QueenChess chess;
chess.Solve();

printf("%d\n",sysSum);

getch();
return 0;

}
hch2205 2010-03-17
  • 打赏
  • 举报
回复
很多书上都有八皇后的算法
ypb362148418 2010-03-17
  • 打赏
  • 举报
回复
编程之美上好像有八皇后的算法,找找看吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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