【数据结构与算法】八皇后问题之递归
2015-08-12 16:31
323 查看
八皇后问题递归求解
八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。【任意两个皇后的位置,不同行,不同列,不同斜线(两条)】
思路
首先采取按行放置皇后,即先放第一行的皇后,放置后,然后在第二行上放置皇后,并进行借测,不冲突的话继续放置第三行,一次类推,到最后发现放置好8行后结束(递归的结束条件)。
代码(递归方法):
八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。【任意两个皇后的位置,不同行,不同列,不同斜线(两条)】
思路
首先采取按行放置皇后,即先放第一行的皇后,放置后,然后在第二行上放置皇后,并进行借测,不冲突的话继续放置第三行,一次类推,到最后发现放置好8行后结束(递归的结束条件)。
代码(递归方法):
#include <stdio.h> int count=0; bool notDanger(int row,int j,int (*chess)[8]) { int i,k; //先判断列方向是否有其他皇后 for(i=0;i<8;i++) { if(*(*(chess+i)+j)!=0)//有皇后了,危险 { return false; } } //判断左上方是否有其他皇后 for(i=row,k=j;i>=0&&k>=0;i--,k--) { if(*(*(chess+i)+k)!=0)//有皇后了,危险 { return false; } } //判断右下方是否有其他皇后 for(i=row,k=j;i<8&&k<8;i++,k++) { if(*(*(chess+i)+k)!=0)//有皇后了,危险 { return false; } } //判断右上方是否有其他皇后 for(i=row,k=j;i>=0&&k<8;i--,k++) { if(*(*(chess+i)+k)!=0)//有皇后了,危险 { return false; } } //判断左下方是否有其他皇后 for(i=row,k=j;i<8&&k>=0;i++,k--) { if(*(*(chess+i)+k)!=0)//有皇后了,危险 { return false; } } return true; } void EightQueen(int row, int n, int (*chess)[8]) { int chess2[8][8],i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) { chess2[i][j]=chess[i][j]; } } if(8==row) { printf("第 %d 种\n",count+1); for(i=0;i<8;i++) { for(j=0;j<8;j++) { printf("%d ",*(*(chess2+i)+j)); } printf("\n"); } printf("\n"); count++; } else { for(j=0;j<n;j++)//n是列 { //判断这个位置是否有危险 //如果没有危险,继续往下 if(notDanger(row,j,chess))//判断是否危险 { for(i=0;i<8;i++) { *(*(chess2+row)+i)=0;//整行所有列的位置都赋值为零 } *(*(chess2+row)+j)=1;//皇后的位置 EightQueen(row+1,n,chess2);//递归 } } } } int main() { int chess[8][8],i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) { chess[i][j]=0; } } EightQueen(0,8,chess); printf("总解决办法有 %d 种方式\n",count); return 0; }
相关文章推荐
- 数据结构Java实现01----算法概述
- 【数据结构】之二叉树的java实现
- 【数据结构】之链栈的java实现
- 【数据结构】之队列的java实现(二)
- 【数据结构】之队列的java实现(一)
- 数据结构上机测试2-2:单链表操作B
- 数据结构上机测试2-1:单链表操作A
- 数据结构-静态链表(学习笔记)
- Python常见数据结构整理
- 编程之久除了算法和数据结构,什么也不属于我们。
- 深入理解Git (二) - 内部的数据结构
- 数据结构实验之队列一:排队买饭
- 数据结构基本概念
- 数据结构复习1
- 数据结构-链式线性表(学习笔记)
- 数据结构(二叉搜索树)
- Redis底层数据结构总结
- Manacher算法求回文半径
- 数据结构基础温故-7.排序
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法