| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 487 人关注过本帖
标题:求助!斑竹请看一下!
只看楼主 加入收藏
DeViLMarryYu
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-11-12
收藏
 问题点数:0 回复次数:9 
求助!斑竹请看一下!
国际象棋中皇后威力最大,可以横向,纵向,斜向攻击,
如果棋盘上放置8个皇后,并且互相不能受到攻击,
共有多少种放置方法???
求答案与代码!
搜索更多相关主题的帖子: 斑竹 
2006-11-13 00:03
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
8皇后问题用回朔解.最近有点忙,有时间再写下.不好意思.

倚天照海花无数,流水高山心自知。
2006-11-13 11:02
guzhou
Rank: 1
等 级:新手上路
威 望:1
帖 子:247
专家分:0
注 册:2006-11-4
收藏
得分:0 

我不是斑竹,试写了一下有92种,不知对否!


2006-11-13 15:20
guzhou
Rank: 1
等 级:新手上路
威 望:1
帖 子:247
专家分:0
注 册:2006-11-4
收藏
得分:0 

这是程序

#include<stdio.h>

static char Queen[8][8];
static int a[8];
static int b[15];
static int c[15];
static int Num=0; //记录总的棋盘状态数

void qu(int k); //参数k代表行

int main()
{
int i,j;

//棋盘初始化,空格为*,放置皇后的地方为@
for(i=0;i<8;i++)
{
a[i]=0; //列标记初始化,表示无列冲突
for(j=0;j<8;j++)
Queen[i][j]='*';
}

//主、从对角线标记初始化,表示没有冲突
for(i=0;i<15;i++)
b[i]=c[i]=0;

qu(0);
return 0;
}

void qu(int i)
{
int j;

for(j=0;j<8;j++)
{
if(a[j]==0&&b[i-j+7]==0&&c[i+j]==0) //如果无冲突
{
Queen[i][j]='@'; //放皇后
a[j]=1; //标记,下一次该列上不能放皇后
b[i-j+7]=1; //标记,下一次该主对角线上不能放皇后
c[i+j]=1; //标记,下一次该从对角线上不能放皇后
if(i<7) qu(i+1); //如果行还没有遍历完,进入下一行
else //否则输出
{
int i,j;
printf("第%d种状态为:\n",++Num);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
printf("%c ",Queen[i][j]);
printf("\n");
}
}

//如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置
Queen[i][j]='*';
a[j]=0;
b[i-j+7]=0;
c[i+j]=0;
}
}
}


2006-11-13 15:21
guzhou
Rank: 1
等 级:新手上路
威 望:1
帖 子:247
专家分:0
注 册:2006-11-4
收藏
得分:0 
斑竹别找我麻烦哪?
在下一片好心!

2006-11-13 16:15
DeViLMarryYu
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2006-11-12
收藏
得分:0 

谢谢楼上的大哥 我初学编程 好多地方请多多指教 我再仔细分析一下代码


我是风筝,高高的飞!我是风筝,我无所谓! 人生注定短暂凄美,风停之后就要坠毁!
2006-11-13 20:02
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
以下是引用guzhou在2006-11-13 16:15:36的发言:
斑竹别找我麻烦哪?
在下一片好心!

呵呵,写的不错啊.

我还不一定写的出来呢.

有时间真的要试下.


倚天照海花无数,流水高山心自知。
2006-11-13 20:14
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

回朔法,效率比较低:

#include<stdio.h>

#define N 20

int x[N] ; //当前解
int sum = 0 ; //可行解的数量
int n=8 ; //规模
bool Place( int k )
{
int i;
for( i = 1 ; i < k ; i++ )
{
if(abs(k-i)==abs(x[k]-x[i])||x[i]==x[k])
{
return false;
}
}
return true;
}

void Backtrack( int t )
{
if( t > n)
{
sum++;
}
else
{
for( int i = 1 ; i<= n ; i++ )
{
x[t] = i ;
if( Place( t )==true )
{
Backtrack( t + 1 ) ;
}
}
}
}

int main()
{
int i;
scanf("%d",&n);
for( i = 1 ; i <= n ; i++ )
{
x[i] = 0 ;
}
Backtrack( 1 ) ;
printf("%d\n",sum);
}


倚天照海花无数,流水高山心自知。
2006-11-13 22:45
guzhou
Rank: 1
等 级:新手上路
威 望:1
帖 子:247
专家分:0
注 册:2006-11-4
收藏
得分:0 
原来写过一个递推算法,效率较高
可现在忘了,谁能指点一下.

2006-11-15 12:03
蓝色冰块
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-11-14
收藏
得分:0 

好厉害

2006-11-15 16:28
快速回复:求助!斑竹请看一下!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015228 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved