VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 804|回复: 6

救命!八皇后问题(VC++),拜托各位了

[复制链接]

2

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-2-6 11:00:01 | 显示全部楼层 |阅读模式
在一个8*8的国际象棋盘上,有八个皇后,每个皇后占一格;要求皇后间不会出现相互“攻击”的现象,既不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。
要求
1)解决问题方法及步骤,具体的方案,要求画出程序执行的流程图。
2)详细的程序清单。
3)程序编写及调试过程中的问题以及解决问题的方法。
4)此次实训中的收获以及程序的不足之处。
回复

使用道具 举报

1

主题

10

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-3-27 20:15:01 | 显示全部楼层
网上一大堆
回复

使用道具 举报

2

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-3-28 18:15:01 | 显示全部楼层
我找到了,但没有我要的(没有回答后面的要求)
回复

使用道具 举报

0

主题

22

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-3-29 21:30:01 | 显示全部楼层
多找几种算法,花点时间读懂所有程序,互相比较一下,就可以交差了^_^
回复

使用道具 举报

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-30 16:15:01 | 显示全部楼层
/* 此程序以“穷举法”来解八皇后问题  文件名BHH.C TC2.0调试通过   */
/* 设一8*8棋盘如下图:         */
/*    1 2 3 4 5 6 7 8         */
/* 1:0 0 0 0 0 0 0 *         */
/* 2:0 * 0 0 0 0 0 0         */
/* 3:0 0 0 * 0 0 0 0         */
/* 4:* 0 0 0 0 0 0 0         */
/* 5:0 0 0 0 0 0 * 0         */
/* 6:0 0 0 0 * 0 0 0         */
/* 7:0 0 * 0 0 0 0 0         */
/* 8:0 0 0 0 0 * 0 0         */
/* 可用一8位序列表示8个皇后的位置,如“82417536”,其意为顺序地列出各行中皇后所在列的序号 */
/* 则问题转换为以下两点:         */
/* 1.生成8位序列P,并使序列中各位数字均不重复,即保证不同列(不同行在定义序列时已能避免). */
/* 2.在满足(1)的序列中找出一个序列,使序列中任意两位上数字之差的绝对值不等于他们的序号 */
/*   之差的绝对值,即在棋盘同一对角线上不存在两个皇后.     */
/* 所有满足(2)的序列即为八皇后问题的解.       */
#include<stdio.h>
#include<math.h>
#define N 8 /* 通过调整N的值可定义棋盘的大小      */
void check(int p[]) /* 函数check用来检测序列P是否满足(2)    */
  {int i, j;
   for (i=0; i<N-1; i++)
     for (j=i+1; j<N; j++)
       if (abs(p[j]-p[i])==j-i) return;  /* 不满足则返回到函数permute继续找下一个P  */
   for (printf("  "), i=0; i<N; printf ("%d",p[i++]) );  /* 满足(2)的序列打印结果  */
  }
/* 函数permute用递归法来找出满足(1)的序列P                                         */
void permute(int n, int p[]) /* n表示当前已找到第几行(设从第8行向上找),用P[]来保存序列  */
  {int i, j;
   if (n==1) check(p);
   for (i=0, j=n-1; i<N; i++) /* 找出下一行可放皇后的列(已放过的列i所对应的P[i]!=0)  */
     if (!p[i]) {p[i]=j; permute(j,p); p[i]=0;}
  }
main()
  {int p[N]={0}, n=N; /* 定义数组p[N]用来存放结果序列,n为行号 */
   printf("\n");
   permute(n+1,p); /* 调用permute函数进行搜索               */
  }
回复

使用道具 举报

1

主题

10

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-3-30 17:00:01 | 显示全部楼层
void queen8(int depth)
{
if(depth==8)
{
for(int x=0;x<8;x++)
{
for(int y=0;y<8;y++)
  {
    if(y==number[x])
    queen[x][y]==1;
    else queen[x][y]=0;
   }
}
}
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
cout<<queen[x][y]<<" ";
cout<<endl;
}

for(int i=0;i<8;i++)
{
   for(int j=0;j<i;j++)
     if(i==number[j])
     goto next;
   if(number[depth-1]==i-1&&number[depth]==i)
    goto next;
   number[depth]=i;
   queen8(depth+1);
   next:
}
}
void main()
{
queen8(0);
}

   
   
   


回复

使用道具 举报

1

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-3-30 18:30:01 | 显示全部楼层
杨雷宝发的哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表