只差一步了!怎么也想不出来,这个问题应该简单吧,请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;
}