| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1438 人关注过本帖
标题:八皇后问题
只看楼主 加入收藏
功夫熊猫
Rank: 2
等 级:论坛游民
帖 子:54
专家分:30
注 册:2010-7-14
结帖率:78.57%
收藏
已结贴  问题点数:20 回复次数:13 
八皇后问题
#include<stdio.h>
int a[8][8]={0};
fun(int n,int a[8][8])
{
    int i,j,m,p,q;
    if(n=7)return 1;
    for(i=0;i<=7;i++)
    {
        p=n;q=i;
        while(p>=0&&q>=0)
        {if(a[p--][q--]!=0)break;}/*检测左上方是否有皇后*/
    if(!(p==0||q==0))continue;
    p=n;q=i;
    while(p<=7&&q<=7)
    {if(a[p++][q++]!=0)break;}/*右下方*/
    if(!(p==7||q==7))continue;
    p=n;q=i;
    while(p>=0&&p<=7&&q>=0&&q<=7)
    {if(a[p++][q--]!=0)break;}/*左下方*/
    if(!(p==0||p==7||q==0||q==7))continue;
    p=n;q=i;
    while(p>=0&&p<=7&&q>=0&&q<=7)
    {if(a[p--][q++]!=0)break;}/*右上方*/
    if(!(p==0||p==7||q==0||q==7))continue;
   
    for(j=0;j<=7;j++)
    if(a[i][j]==0&&a[j][i]==0)continue;/*上下左右*/
    if(j==7)
    a[n][i]=1;
    break;
    }
    fun(n+1,a);
}
main()
{
    int n=0,i,j;
    for(n=0;n<=7;n++)
    {
        if(fun(n,a)==1)
        {
            for(i=0;i<=7;i++)
        {    for(j=0;j<=7;j++)
            printf("%5d",a[i][j]);
        printf("\n");}
        printf("\n");
        }
    }
}
在国际象棋中,把八个皇后放在棋盘上,使它们中任何一个都无法攻击其余的皇后,这个程序那些地方有问题。。。求大虾赐教
搜索更多相关主题的帖子: 皇后 
2010-09-16 18:18
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:5 
程序代码:
#include <stdio.h>
#define N 8
int x[20];
int chess[N+1][N+1];
int ok(int k)
{
  int i, s = 1;
  for (i = 1; i < k; i++)
    s = s &&
      (x[i] != x[k]) &&
      (i-k != x[i]-x[k]) && 
      (k-i != x[i]-x[k]);
  return s;
}
void clrchess()
{int i,j;
  for(i=1;i<=N;i++)
    for(j=1;j<=N;j++)
      chess[i][j]=0;
}
void print()
{int i,j;
  for(i=1;i<=N;i++)
    { for(j=1;j<N;j++)
    printf("%d",chess[i][j]);
      printf("\n");
    }
}
int f()
{
  int k = 1, v = 0,j,s,m;
  x[1] = 1;
  while (k > 0)
    {
      if (k > N)
    {    v++;
      for (j = 1; j <=N; j++) printf("%d ", x[j]);
      printf("\n");
          for(s=1;s<=N;s++)
          chess[s][x[s]]=1;
          print();
      clrchess();
      printf("\n");
      x[--k]++;
    }
      else if (x[k] > N) x[--k]++;
      else if (ok(k)) x[++k] = 1;
      else x[k]++;
    }
  return v;
}
int main()
{
  int v = f();
  printf("%d\n", v);
  return 0;
}


[ 本帖最后由 Devil_W 于 2010-9-16 18:57 编辑 ]
收到的鲜花
  • Windy0Winll2010-09-17 17:30 送鲜花  5朵  
  • Windy0Winll2010-09-17 17:31 送鲜花  5朵  
  • Windy0Winll2010-09-17 17:31 送鲜花  5朵  
  • Windy0Winll2010-09-17 17:32 送鲜花  5朵   附言:读Devil_W大哥的代码总是感觉很舒服!!!
2010-09-16 18:49
makebest
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:658
专家分:962
注 册:2005-3-17
收藏
得分:5 
2楼的正解,打印改一下:
程序代码:
#include <stdio.h>
#include <conio.h>
#define N 8
int x[20];
int chess[N+1][N+1];
int ok(int k)
{
    int i, s = 1;
    for (i = 1; i < k; i++)
        s = s &&
        (x[i] != x[k]) &&
        (i-k != x[i]-x[k]) &&
        (k-i != x[i]-x[k]);
    return s;
}
void clrchess()
{
    int i,j;
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
            chess[i][j]=0;
}
void print()
{
    int i,j;
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=N;j++)
            printf("%s ",chess[i][j]==0 ? "-" : "0");
        printf("\n");
    }
}
int f()
{
    int k = 1, v = 0,j,s,m;
    x[1] = 1;
    while (k > 0)
    {
        if (k > N)
        {
            v++;
            for (j = 1; j <=N; j++)
                printf("%d ", x[j]);
            printf("\n");
            for(s=1;s<=N;s++)
                chess[s][x[s]]=1;
            print();
            clrchess();
            printf("\n");
            x[--k]++;
        }
        else
            if (x[k] > N)
                x[--k]++;
            else
                if (ok(k))
                    x[++k] = 1;
                else
                    x[k]++;
    }
    return v;
}
int main()
{
    int v = f();
    printf("%d\n", v);
    getch();
    return 0;
}

 
收到的鲜花
  • Windy0Winll2010-09-17 17:35 送鲜花  5朵   附言:您真细心啊,那个打印部分的j没取到等号都被 ...
2010-09-16 19:22
功夫熊猫
Rank: 2
等 级:论坛游民
帖 子:54
专家分:30
注 册:2010-7-14
收藏
得分:0 
能不能把流程图画出来
2010-09-16 21:52
功夫熊猫
Rank: 2
等 级:论坛游民
帖 子:54
专家分:30
注 册:2010-7-14
收藏
得分:0 
好复杂啊
2010-09-16 22:51
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:5 
顶2楼,原因很显然.

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-17 17:36
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:5 
回复 6楼 Windy0Winll
这个回帖先是让我感到 惊谔, 然后是 迷惑...

我就是真命天子,顺我者生,逆我者死!
2010-09-18 11:04
真我
Rank: 4
等 级:业余侠客
威 望:1
帖 子:146
专家分:210
注 册:2010-7-14
收藏
得分:0 
这问题有很多种解法的
2010-09-18 22:05
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
回复 8楼 真我
虽然这题目的方法很多。
但2楼的思想在处理全排列等类似问题的时候确实是很好的选择之一。这是值得好好学习下的。

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-22 17:41
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
2楼整天说别人的代码烂, 实际上他自己的代码才是最烂的。
谈什么重载啊、封装啊,轮到他自己就傻B了。 这一堆的 巴根草, 不知道怎么就看的舒服了。

[ 本帖最后由 BlueGuy 于 2010-9-22 18:03 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-09-22 18:00
快速回复:八皇后问题
数据加载中...
 
   



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

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