八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。

其解决办法和我以前发过的【算法之美—Fire Netwww.cnblogs.com/lcw/p/3159414.html】类似

题目:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

 #include <stdio.h>

 int count = ;    //全局变量,统计所有解法

 int notDanger( int row, int j, int (*chess)[] )    //判断是否存在危险
{
int i, k, flag1=, flag2=, flag3=, flag4=, flag5=; // 判断列方向
for( i=; i < ; i++ )
{
if( *(*(chess+i)+j) != )
{
flag1 = ;
break;
}
} // 判断左上方
for( i=row, k=j; i>= && k>=; i--, k-- )
{
if( *(*(chess+i)+k) != )
{
flag2 = ;
break;
}
} // 判断右下方
for( i=row, k=j; i< && k<; i++, k++ )
{
if( *(*(chess+i)+k) != )
{
flag3 = ;
break;
}
} // 判断左下方
for( i=row, k=j; i>= && k<; i--, k++ )
{
if( *(*(chess+i)+k) != )
{
flag4 = ;
break;
}
} // 判断右上方
for( i=row, k=j; i< && k>=; i++, k-- )
{
if( *(*(chess+i)+k) != )
{
flag5 = ;
break;
}
} if( flag1 || flag2 || flag3 || flag4 || flag5 )
{
return ;
}
else
{
return ;
}
} // 参数 row:表示起始行
// 参数 n:表示列数
// 参数 (*chess)[8]: 表示指向棋盘每一行的指针
void EightQueen( int row, int n, int (*chess)[] )
{
int chess2[][], i, j; for( i=; i < ; i++ )
{
for( j=; j < ; j++ )
{
chess2[i][j] = chess[i][j];
}
} if( == row ) //本次解法完毕
{
printf("第 %d 种 \n", count+);
for( i=; i < ; i++ )
{
for( j=; j < ; j++ )
{
printf("%d ", *(*(chess2+i)+j));
}
printf("\n");
}
printf("\n");
count++;
}
else
{
for( j=; j < n; j++ )
{
if( notDanger( row, j, chess ) ) // 判断这个位置是否存在危险
{
for( i=; i < ; i++ )
{
*(*(chess2+row)+i) = ;
} *(*(chess2+row)+j) = ; EightQueen( row+, n, chess2 ); //没有危险,继续往下
}
}
}
} int main()
{
freopen( "output.txt", "w", stdout ); //将输出结果保存到 output.txt中 int chess[][], i, j; for( i=; i < ; i++ )
{
for( j=; j < ; j++ )
{
chess[i][j] = ;
}
} EightQueen( , , chess ); printf("总共有 %d 种解决方法 \n\n", count); fclose(stdout);
return ;
}

【Acm】八皇后问题的更多相关文章

  1. ACM:回溯,八皇后问题,素数环

    (一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...

  2. 八皇后算法的另一种实现(c#版本)

    八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...

  3. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  4. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  5. Python解决八皇后问题

    最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...

  6. OpenJudge1700:八皇后问题 //不属于基本法的基本玩意

    1700:八皇后问题//搜索 总时间限制:  10000ms 内存限制:  65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和 ...

  7. C#八皇后问题 枚举值

    记得刚出道的时候, 有考虑怎么面试, 以及可能会遇到的面试题, 有一个人说了一下 八皇后问题, 据说要用 sql 语句写出来, 暂时我 写了一个C#版本的, 经测验,八皇后算法结果为 92种, 这个与 ...

  8. 八皇后(dfs+回溯)

    重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...

  9. C语言解决八皇后问题

    #include <stdio.h> #include <stdlib.h> /* this code is used to cope with the problem of ...

随机推荐

  1. 向Kubernetes集群删除Node

    Kubernetes集群中移除Node在master节点上执行: kubectl drain swarm1 --delete-local-data --force --ignore-daemonset ...

  2. sqlserver查询数据表中每个类别最新的一条记录

    表tariff_info, 原始数据: 想要的结果:以start_time时间倒序排序, 以code分类, 查询每一类最新的一条记录 sql: SELECT a.* FROM TARIFF_INFO ...

  3. ajax, jQuery, jQueryeasyUI

    1.ajax与jQueryajax是jquery库里面的一个被封装好的函数,可以拿来直接使用.没有jquery的话,ajax的使用就得用原生的javascript去写,比较麻烦. 2.jQuery E ...

  4. linux磁盘相关命令

    一.查看文件夹大小du du -h -d1 2>/dev/null 解释: h表示以可读性较好的方式显示,即带单位显示 d表示深度depth,为1表示只显示当前目录下文件的大小 2>/de ...

  5. 【虚拟化系列】VMware vSphere 5.1 网络管理

       网络是VMware vSphere 5.1的基础,所有虚拟机都需要网络来进行通信.如果将所有的虚拟机都看成是物理机,则在网络拓扑上,需要网卡和交换机等不同的网络连接设备和方式.而在虚拟化中,这些 ...

  6. Linux 日志切割工具cronolog详解

    一.前言 二.cronolog 简介 三.cronolog 特点 四.cronolog 安装 五.cronolog 使用 六.cronolog 总结 注,操作系统 CentOS 6.4 x86_64, ...

  7. Android 获取包名,版本信息

    Android 获取包名,版本信息及VersionName名称     <span style="font-size: 14px;">private String ge ...

  8. block(四)揭开神秘面纱(下)-b

    看此篇时,请大家同时打开两个网址(或者下载它们到本地然后打开): http://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/BlocksRuntim ...

  9. Docker 的技术组件

    Docker可以运行于任何安装了现代Linux内核的x64主机上.推荐的内核版本是3.8或者更高.Docker的开销比较低,可用于服务器.台式机或者笔记本.它包括以下几个部分. 一个原生的Linux容 ...

  10. Oracle 12C -- Invisible Columns

    在12C中,当一个列被定义为"不可见"的时候,没有直接访问该列的sql语句是无法看到"不可见列"的,显式引用"不可见列"的语句是可以访问和操 ...