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

来源:互联网 发布:淘宝美工如何做首页 编辑:程序博客网 时间:2024/06/05 15:08

1、问题

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




2、代码实现

#include <stdio.h>#include <stdlib.h>/** *在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击 *即任意两个皇后都不能处于同一行、同一列或同一斜线上, *问有多少种摆法,并把所有合法的二维数组打印出来 */#define M 8int 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 queen1111deMacBook-Pro:dabian a1111$ ./queen
count is 910 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 920 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 




原创粉丝点击