您的位置:首页 > 编程语言

C和指针之数组编程练习8(8皇后问题)

2017-11-14 23:28 381 查看

1、问题

  *在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击

 *即任意两个皇后都不能处于同一行、同一列或同一斜线上,

 *问有多少种摆法,并把所有合法的二维数组打印出来



2、代码实现

#include <stdio.h>
#include <stdlib.h>

/**
*在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击
*即任意两个皇后都不能处于同一行、同一列或同一斜线上,
*问有多少种摆法,并把所有合法的二维数组打印出来
*/

#define M 8

int matrix[M + 1][M + 1] = {0};

//检查这行的皇后是否与上面的行里面的皇后相冲突
//返回0就是相冲突,返回1就是不冲突,参数i,j就是
//需要检验这个皇后的下标

int is_legal(int (*matrix)[M + 1], int i, int j)
{
for (int k = 1; k <= i - 1; k++)
{
for (int l = 1; l <= M; l++)
{   //判断之前的皇后
if (matrix[k][l] == 1)
{
if (abs(i - k) == abs(j - l) || l == j)
return 0;
}
}
}
return 1;
}

//打印有能组成皇后的数组
void my_printf(int (*matrix)[M + 1])
{
static int count = 0;
printf("count is %d\n", ++count);
for (int i = 1; i <= M; ++i)
{
for (int j = 1; j <= M; ++j)
{
matrix[i][j] == 1 ? printf("1 ") : printf("0 ");
}
printf("\n");
}
printf("\n");
}

void queen(int i)
{
if (i > M)
my_printf(matrix);
else
for (int j = 1; j <= M; ++j)
{
matrix[i][j] = 1;
if (is_legal(matrix, i, j))
queen(1 + i);
matrix[i][j] = 0;
}
}

int main()
{
queen(1);
return 0;
}




3、运行结果

1111deMacBook-Pro:dabian a1111$ vim queen.c
1111deMacBook-Pro:dabian a1111$ gcc -g queen.c -o queen
1111deMacBook-Pro:dabian a1111$ ./queen
count is 91
0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0

count is 92
0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: