| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 506 人关注过本帖
标题:八皇后问题。。大家帮忙找下问题吧。。
只看楼主 加入收藏
霖海听涛
Rank: 2
等 级:论坛游民
帖 子:16
专家分:22
注 册:2010-7-18
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:3 
八皇后问题。。大家帮忙找下问题吧。。
老师要求是八皇后问题的第一个皇后的位置得由键盘输入,下面是我用C写的一个程序,检查没错误,但是没法输出,大家帮忙看一下吧。。。
#include<stdio.h>
#include<math.h>
#define MAX 9
int board[MAX],m;
int check2(int n)
 {int i;
  for(i=1;i<n+1;i++)
   {if(board[n+1]==board[i]||(n+1-i)==fabs(board[n+1]-board[i]))
     return 0;}
  return 1;}
 int check1(int n)
   {int i;
   for(i=n;i<=m;i++)
    {if(board[n-1]==board[i]||(n-1-i)==fabs(board[n-1]-board[i]))
      return 0;}
    return1;}
 void put2(int n)
   {int i;
    for(i=1;i<MAX;i++)
   {board[n+1]=i;
    if(check2(n))
      {if((n+1)==MAX-1)
           for(i=m+1;i<MAX;i++)
             printf("(%d,%d)",i,board[i]);
         else put2(n+1);}
      }
}
  void put1(int n)
  {int i;
   for(i=1;i<MAX;i++)
   {board[n-1]=i;
   if(check1(n))
    {if((n-1)==1)
       {for(i=m;i>0;i--)
         printf("(%d,%d)",i,board[i]);
         put2(n);}
      else put1(n-1);}
      }
    }
void main()
{int n;
printf("Input the placement:\n");
scanf("%d,%d",&m,&board[m]);
n=m;
board[n]=board[m];
put1[n];}
输入第一个皇后位置后,输出结果总是"Null pointer assignment",不知道哪里出现问题了。。。
搜索更多相关主题的帖子: 皇后 
2010-07-18 14:16
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:6 
程序代码:
#include<stdio.h>
int c[9][9]={0};
int n=8,x[20];
int ok(int k)
{ int i,t=1;
     for(i=1;i<k;i++)
      t=t&&x[i]!=x[k]&&x[i]-x[k]!=i-k&&x[i]-x[k]!=k-i;
     return t;
}
int f(int k)
{  int v=0,i,j;
     if(k>n)
     { v=1;
      for(i=1;i<=n;i++)printf("%d ",x[i]);
      printf("\n");
     }
     else
      for(j=1 ; j<=n ; j++)
      {   x[k]=j;
           if(ok(k))v+=f(k+1);
      }
     return v;
}
                    
int main()
{  int v;
     v=f(1);
     printf("\nv=%d\n",v);
     return 0;
}
2010-07-18 14:53
yjchaos
Rank: 2
等 级:论坛游民
帖 子:16
专家分:36
注 册:2010-7-4
收藏
得分:6 
你的子函数中board[n+1],board[i]都没有赋值吧
2010-07-18 16:52
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:6 
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。
#include "stdio.h"   
#include "windows.h"#define N 8 /* 定义棋盘大小 */
int place(int k); /* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */
void backtrack(int i);/* 主递归函数,搜索解空间中第i层子树 */
void chessboard(); /* 每找到一个解,打印当前棋盘状态 */  
static int sum, /* 当前已找到解的个数 */
x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列 */
int main(void)
{
backtrack(0); system("pause");
return 0; }
int place(int k)
{/* 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击.
 x[j] == */
/* x[k] 时,两皇后在同一列上;abs(k - j) == abs(x[j] - x[k]) 时,两皇 */
/* 后在同一斜线上。两种情况两皇后都可相互攻击,故返回0表示不符合条件。*/  
for (int j = 0; j < k; j ++)  
if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0;   return 1;   }
void backtrack(int t)  
{ /* t == N 时,算法搜索至叶结点,得到一个新的N皇后互不攻击的放置方案 */  
if (t == N) chessboard();else   for (int i = 0; i < N; i ++)
{x[t] = i;
if (place(t)) backtrack(t + 1);
}
}
void chessboard()   
{printf("第%d种解法:\n", ++ sum);
for (int i = 0; i < N; i ++)
{
for (int j = 0; j < N; j ++)
if (j == x[i]) printf("@ ");
else printf("* ");
printf("\n");}
printf("\n");  
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-18 17:14
快速回复:八皇后问题。。大家帮忙找下问题吧。。
数据加载中...
 
   



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

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