| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 800 人关注过本帖
标题:八皇后问题,我不会解,会解的告诉我
只看楼主 加入收藏
lsw111
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-9-2
收藏
 问题点数:0 回复次数:7 
八皇后问题,我不会解,会解的告诉我
八皇后问题:在国际象棋的棋盘(8行八列)上放上八个皇后,在横、纵、斜各个方向上都只能有一个皇后存在。编程将所有可能的摆放方法都打印出来。(用一个8*8的数组来表示棋盘,皇后为1,空位为0。)

高手帮我解解,谢谢!!!
搜索更多相关主题的帖子: 皇后 
2006-12-23 17:11
lizhang
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-11-24
收藏
得分:0 

你是新手吗?

2006-12-23 19:17
lizhang
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2006-11-24
收藏
得分:0 

wo shu shang you

2006-12-23 19:24
lzy340623339
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2006-10-12
收藏
得分:0 

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 30
#define MARK 'Q'

void initial(void);
void display(void);
void class_1(void);
void class_2(void);
void class_3(void);
void class_4(void);

int n;
char board[MAXSIZE+1][MAXSIZE+1];

void main(void)
{
void (*funct[])() = { class_1, class_2,
class_4, class_3,
class_1, class_2
};
char line[100];

printf("\nOne Solution for N Queens' Problem");
printf("\n==================================");
printf("\n\nBoard Size Please (N > 3) --> ");
gets(line);
n = atoi(line);

if (n > 3) {
initial();
(*funct[n % 6])();
display();
}
else
printf("\nIllegal Board Size.");
}
void initial(void)
{
int i, j;

for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
board[i][j] = ' ';
}
#define DRAWGRID (N) { inti;
printf("\n+");
for (i = 1; i <= N; i++) printf("-+"); }


#define DRAWLINE(N, r) { int i; printf("\n|"); for (i = 1; i <= N; i++) printf("%c|", board[r][i]); }

void display(void)
{
int r;

DRAWGRID(n);
for (r = 1; r <= n; r++) {
DRAWLINE(n, r);
DRAWGRID(n);
}
printf("\n");
}
void class_1(void)
{
int i;

for (i = 1; i <= n/2; i++)
board[2*i][i] = board[2*i-1][n/2+i] = MARK;
}
void class_2(void)
{
int i;

for (i = 1; i <= (n-1)/2; i++)
board[2*i][i] = MARK;
for (i = 1; i <= (n+1)/2; i++)
board[2*i-1][(n-1)/2+i] = MARK;
}

void class_3(void)
{
int i;

for (i = 1; i <= (n-3)/2; i++)
board[2*i+2][i] = board[2*i+3][(n-1)/2+i] = MARK;
board[1][n-1] = board[2][(n-2)/2] = board[3][n] = MARK;
}
void class_4(void)
{
int i;

if (n > 8) {
for (i = 1; i <= 3; i++)
board[2*i-1][n/2-2+i] = MARK;
board[2][n] = board[4][1] = board[6][n-1] = MARK;
for (i = 1; i <= n/2 - 3; i++)
board[2*i+5][i+1] = board[2*i+6][n/2+1+i] = MARK;
}
else {
for (i = 1; i <= 4; i++)
board[2*i][i] = MARK;
board[1][6] = board[3][5] = MARK;
board[5][8] = board[7][7] = MARK;
}
}

2006-12-24 09:33
lsw111
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-9-2
收藏
得分:0 

我是新手,谢谢解答!

2006-12-24 11:49
wangyasen
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-12-29
收藏
得分:0 
#include<iostream>
using namespace std;
#define QueenNumber 8
int y[QueenNumber]; file://存放行上的哪一列放了皇后
#define display( t) for(int i=0;i<QueenNumber;i++) cout<<"("<<i<<","<<y[i]<<")"<<" "; cout<<endl;
void bs(int x)
{
if(x>=QueenNumber){display(y);return;}
int k,i;
for(k=0;k<QueenNumber;k++)//遍历列
{
for(i=0;i<x;i++)
{
if(k==y[i]||x+k==i+y[i]||x-k==i-y[i]) break;
}
if(i>=x)
{
y[i]=k;
bs(x+1);
}
}
return;
}
int main()
{
bs(0);
return 0;
}
你可以自己再添写输出语句 ,用Q,#输出,这样一目了然。譬如说,四皇后的问题,如下显示
#Q##
###Q
Q###
##Q#
2006-12-29 17:07
知心如幻
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-12-30
收藏
得分:0 
我写的是多文件结构,不好给你
2006-12-31 18:55
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

/*C写的.回朔法*/
#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++;
for(int i=1;i<=n;i++)
{
/* for(int j=1;j<=n;j++)
{
if(j==x[i])
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
*/
printf("%-3d%-3d\n",i,x[i]);
}
printf("\n");
}
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);
}


倚天照海花无数,流水高山心自知。
2007-01-03 20:42
快速回复:八皇后问题,我不会解,会解的告诉我
数据加载中...
 
   



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

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