| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 667 人关注过本帖
标题:只差一步了!怎么也想不出来,这个问题应该简单吧,请C神看看..
只看楼主 加入收藏
avery110
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-8-31
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
只差一步了!怎么也想不出来,这个问题应该简单吧,请C神看看..
小弟初学C,望吧里各位C神给瞅一瞅,小弟无比感谢!~~

还是那经典的八皇后问题,主要是把算出来结果筛选出来:
怎么把这里的#define M 2
的值通过输入数据来代替呀,就是放置皇后里的board[0][M](通过scanf):

#include<stdio.h>
 
#define TRUE 1
#define FALSE 0
#define M 2
  
int board[8][8];    /*棋盘*/
  
/* printchess(打印函数)
** 打印解决方案
*/
void
printchess()
{
    int row, column;
    static int solutions;
  
    solutions += 1;
    printf("第 %d 种:\n",solutions);
  
    for(row = 0;row < 8;row++)
    {
        for (column = 0;column < 8; column++)
        {
            board[row][column]? printf("★"):printf("□");
        }
        putchar('\n');
    }
    putchar('\n');
}
/* conflicts(检查冲突函数)
** 用于检查某一行某一列是否与其他行列相互攻击
** 斜下方与正下方不需要检查,因为当前下方位置没有皇后
*/
int
conflicts(int row,int column)
{
    int i;
    for (i = 1;i<8;i++)
    {
        /*上*/
        if (row - i >= 0 && board[row - i][column])return TRUE;
  
        /*左*/
        if (column -i >= 0 && board[row][column - i])return TRUE;
  
        /*右*/
        if (column + i < 8 && board[row][column + i])return TRUE;
  
        /*斜左上方*/
        if(column - i >= 0 && row - i >= 0 && board[row - i][column - i])return TRUE;
  
        /*斜右上方*/
        if(column + i < 8 && row - i >= 0 && board[row - i][column + i])return TRUE;
    }
    /*不存在相互攻击,返回false*/
    return FALSE;
}
/* place_queen(放置皇后)
** 第一行不需要检查,因为只有一个皇后。皇后放置的位置设置为true。
** 如果某M行的所有列放置皇后都存在互相攻击,那么需要返回到M-1行中放置皇后的位置,
** 将M-1行的皇后位置设置为false,寻找这行的下一个可以放置皇后的位置,如果存在再检查第M行可以放置皇后的位置。
** 如果不存在,则返回到第M-2行。
** 如果8个皇后成功放置完毕,则打印棋盘.
*/
void
place_queen(int row)
{
 int column,n;
 for (column = 0;column < 8; column++)
    {
  board[row][column] = TRUE;
        if (row == 0 || !conflicts(row,column))
        {   
            if (row < 7)
            {
                place_queen(row + 1);
            }
            else
            {
   
      if(board[0][M])printchess();
            }
        }
  board[row][column] = FALSE; /*终止循环标志*/
    }
}
  
int
main()
{
 place_queen(0);
 return 0;
}
搜索更多相关主题的帖子: include 经典的 打印 
2012-08-31 11:52
wangxiang935
Rank: 3Rank: 3
来 自:南京
等 级:论坛游侠
帖 子:177
专家分:179
注 册:2012-7-11
收藏
得分:3 
初学这么强,全是你自己写的?
2012-08-31 14:44
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:3 
C99支持这个,就是可变数组的声明,
用vc6.0是不行的,我不知道vc多少可以
不过我用gcc编译的话是没问题~
2012-08-31 20:53
Dua瀚狼
Rank: 2
来 自:湖南长沙
等 级:论坛游民
帖 子:59
专家分:78
注 册:2012-3-11
收藏
得分:3 
我承认我学了一年的C了,写不出这样的代码!

我怀旧,因为我看不到未来。
2012-09-01 00:58
周云
Rank: 1
等 级:新手上路
帖 子:46
专家分:2
注 册:2012-9-1
收藏
得分:3 
我也学了半年了!看到还是看的懂!但是看着都还有些吃力!佩服!!
2012-09-01 10:10
包头师范学校
Rank: 2
等 级:论坛游民
帖 子:26
专家分:51
注 册:2012-8-24
收藏
得分:3 
程序代码:
#include <stdio.h>

#define MAX 8
#define NUM 100000

int arr[MAX][MAX];
int result[NUM][MAX];

int tmp[MAX];

int res;

void init()
{
    int i,j;
    for(i=0;i<MAX;i++)
    {
        for(j=0;j<MAX;j++) arr[i][j]=0;
        tmp[i]=-1;
    }
    res=0;
}

void Attack(int x,int y,int inc)
{
    int i,j;
    for(i=0;i<MAX;i++) arr[i][y]+=inc;
    for(i=0;i<MAX;i++) arr[x][i]+=inc;
    for(i=x,j=y;i<MAX&&j<MAX;i++,j++) arr[i][j]+=inc;
    for(i=x,j=y;i>=0&&j>=0;i--,j--) arr[i][j]+=inc;
    for(i=x,j=y;i<MAX&&j>=0;i++,j--) arr[i][j]+=inc;
    for(i=x,j=y;i>=0&&j<MAX;i--,j++) arr[i][j]+=inc;

 



    arr[x][y]-=5*inc;
}

void Queen(int layer)
{
    int i;
    if(layer==MAX)
    {
        for(i=0;i<MAX;i++)
        {
            result[res][i]=tmp[i];
        }
        res++;
        return;
    }
    for(i=0;i<MAX;i++)
    {
        if(arr[layer][i]) continue;
        Attack(layer,i,1);
        tmp[layer]=i;
        Queen(layer+1);
        Attack(layer,i,-1);
        tmp[layer]=-1;
    }
}

int main()
{
    int i,j;
    init();
    Queen(0);
    for(i=0;i<res;i++)
    {
        for(j=0;j<MAX;j++) printf("%d ",result[i][j]);
        printf("\n");
    }
    printf("%d\n",res);
    return 0;
}
这是我那会写的代码,楼主参考一下吧。
2012-09-01 11:47
netlin
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:24
帖 子:544
专家分:4308
注 册:2012-4-9
收藏
得分:3 
高手如林!
看起来,楼主是一个很用心的人!

做自己喜欢的事!
2012-09-02 08:27
LittleCer
Rank: 2
来 自:一个小村庄
等 级:论坛游民
帖 子:19
专家分:15
注 册:2012-9-1
收藏
得分:3 
如果不用#difine M 2,每次使用M之前赋值M=2, 就可以scanf("%d",&M);   
不知这样行否?
2012-09-02 11:53
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
只看见代码里一个地方用了 M 呀。你就手动输入有什么错误?
2012-09-02 17:51
快速回复:只差一步了!怎么也想不出来,这个问题应该简单吧,请C神看看..
数据加载中...
 
   



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

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