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
相关文章推荐
- C和指针之数组编程练习3(判断矩阵是否为单位矩阵)
- C语言编程(练习8:数组与指针)
- C Primer Plus (第五版) 第十章 数组和指针 编程练习
- C和指针之数组编程练习5 (矩阵相乘)
- C语言编程(练习1:数组和指针)
- C语言编程(练习2:数组和指针)
- C和指针之数组之编程练习2
- 【编程练习】将string容器保存在字符指针数组中
- C语言编程(练习3:数组与指针)
- C语言编程(练习9:数组与指针)
- 《C Primer Plus 第五版》第十章(数组和指针)编程练习
- C语言编程(练习5:数组与指针)
- C Primer Plus 第10章 数组和指针 编程练习
- C语言编程(练习4:数组与指针)
- 编程练习:N皇后问题 (JAVA)
- C语言编程(练习6:数组与指针)
- 编程练习:N皇后问题 (JAVA)
- 数组拷贝问题,实际上是指针指向发生变化
- C和指针之字符串编程练习10(判断字符串是否是回文数)
- 函数的返回值问题(返回指针和数组的区别)静态存储区、动态数据区、栈