八皇后
2016-07-26 09:14
183 查看
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,
使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横
行、纵行或斜线上。
对于八皇后问题,每次放置皇后时都要找到一个合适的位置,我们可以先放第一行,然后从第一列到最后一列每个位置都去尝试,判断在此位置的同一横行,竖行,斜线(有两条)上是否放有其他皇后,若有其他皇后,则在此行的下一个位置尝试,找到合适位置后,在下一行以同样的方式去寻找,当八个皇后全部放置后说明已经找到了一种方式,寻找其他方式时,我们可以先把最后一个皇后(即第八行放置的皇后)回收(取消标记),回到上一个皇后(第七行),向下一个位置尝试,若找到合适位置,则在第八行以同样的方式寻找合适位置,若没有找到合适位置,回收第七行皇后(取消标记),则回到上一个皇后(第六行)以同样的方式进行尝试,直到找到全部的合适位置
#include<stdio.h>
int count=0;
void printf_arr();
int judge(int ,int );
void fun(int);
int arr[8][8]={0};
//二维数组模拟棋盘,初始化为 0
int main()
{
fun(0);
printf("%d\n",count);
return 0;
}
void fun(int n)
{
int i;
if(n==8)
{
count++;
printf_arr();
}
else
for(i=0;i<8;i++)
{
if(judge(n,i)==1)
//调用函数找出第n行合适的位置
{
arr
[i]=1; //若合适 标记为 1
fun(n+1);
//进行下一行判断
arr
[i]=0;
// 取消标记 即回收此皇后 进行下一次尝试
}
}
}
int judge(int x,int y) //因为是由上向下遍历,所以只需判断此行上面部分
{
int i,j;
for(i=x;i>=0;i--) //判断此列上方是否存在其他皇后
{
if(arr[i][y]==1)
{
return 0;
}
}
for(i=x,j=y;i>=0&&j>=0;i--,j--)
//判断斜线左上方是否存在其他皇后
{
if(arr[i][j]==1)
{
return 0;
}
}
for(i=x,j=y;i>=0&&j<8;i--,j++)
// 判断斜线右上方是否存在其他皇后
{
if(arr[i][j]==1)
{
return 0;
}
}
return 1;
}
void printf_arr()
{
int i,j;
for( i=0;i<8;++i) // 输出合适的方法
{
for( j=0;j<8;++j)
printf("%2d", arr[i][j]);
printf("\n");
}
printf("\n");
}
使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横
行、纵行或斜线上。
对于八皇后问题,每次放置皇后时都要找到一个合适的位置,我们可以先放第一行,然后从第一列到最后一列每个位置都去尝试,判断在此位置的同一横行,竖行,斜线(有两条)上是否放有其他皇后,若有其他皇后,则在此行的下一个位置尝试,找到合适位置后,在下一行以同样的方式去寻找,当八个皇后全部放置后说明已经找到了一种方式,寻找其他方式时,我们可以先把最后一个皇后(即第八行放置的皇后)回收(取消标记),回到上一个皇后(第七行),向下一个位置尝试,若找到合适位置,则在第八行以同样的方式寻找合适位置,若没有找到合适位置,回收第七行皇后(取消标记),则回到上一个皇后(第六行)以同样的方式进行尝试,直到找到全部的合适位置
#include<stdio.h>
int count=0;
void printf_arr();
int judge(int ,int );
void fun(int);
int arr[8][8]={0};
//二维数组模拟棋盘,初始化为 0
int main()
{
fun(0);
printf("%d\n",count);
return 0;
}
void fun(int n)
{
int i;
if(n==8)
{
count++;
printf_arr();
}
else
for(i=0;i<8;i++)
{
if(judge(n,i)==1)
//调用函数找出第n行合适的位置
{
arr
[i]=1; //若合适 标记为 1
fun(n+1);
//进行下一行判断
arr
[i]=0;
// 取消标记 即回收此皇后 进行下一次尝试
}
}
}
int judge(int x,int y) //因为是由上向下遍历,所以只需判断此行上面部分
{
int i,j;
for(i=x;i>=0;i--) //判断此列上方是否存在其他皇后
{
if(arr[i][y]==1)
{
return 0;
}
}
for(i=x,j=y;i>=0&&j>=0;i--,j--)
//判断斜线左上方是否存在其他皇后
{
if(arr[i][j]==1)
{
return 0;
}
}
for(i=x,j=y;i>=0&&j<8;i--,j++)
// 判断斜线右上方是否存在其他皇后
{
if(arr[i][j]==1)
{
return 0;
}
}
return 1;
}
void printf_arr()
{
int i,j;
for( i=0;i<8;++i) // 输出合适的方法
{
for( j=0;j<8;++j)
printf("%2d", arr[i][j]);
printf("\n");
}
printf("\n");
}
相关文章推荐
- byteConvertInputStream
- hihocoder #1341 Constraint Checker
- C#实现微信开发
- 转: Ubuntu 安装字体方法
- .NET AOP (六)在编译阶段PostSharp
- [李景山php]每天laravel-20160927|Factory.php
- js判断空对象的实例(超简单)
- 数据结构总览
- iPhone5,32位,时间戳显示46年前的问题
- Android studio 下 抬头菜单图标不显示解决方案
- 嵌入式linux项目开发(一)——web数据交互
- 欢迎使用CSDN-markdown编辑器
- [李景山php]每天laravel-20160927|Factory.php
- lintcode longest-common-subsequence 最长公共子序列 证明
- LoadRunner监控Tomcat性能以及tomcat环境部署
- Leetcode常用五大算法思想
- 【Codeforces Round 363 (Div 2) E】【概率DP 期望DP 逆推等价法】LRU Cache替换LRU原则超多步数后每个数据在Cache中的概率
- Spark的worker运行分析
- Android实现短信验证功能的代码
- 常用代码片段整理