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



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

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