【Acm】八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。
其解决办法和我以前发过的【算法之美—Fire Net:www.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】八皇后问题的更多相关文章
- ACM:回溯,八皇后问题,素数环
(一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- Python学习二(生成器和八皇后算法)
看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...
- Python解决八皇后问题
最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...
- OpenJudge1700:八皇后问题 //不属于基本法的基本玩意
1700:八皇后问题//搜索 总时间限制: 10000ms 内存限制: 65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和 ...
- C#八皇后问题 枚举值
记得刚出道的时候, 有考虑怎么面试, 以及可能会遇到的面试题, 有一个人说了一下 八皇后问题, 据说要用 sql 语句写出来, 暂时我 写了一个C#版本的, 经测验,八皇后算法结果为 92种, 这个与 ...
- 八皇后(dfs+回溯)
重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...
- C语言解决八皇后问题
#include <stdio.h> #include <stdlib.h> /* this code is used to cope with the problem of ...
随机推荐
- 向Kubernetes集群删除Node
Kubernetes集群中移除Node在master节点上执行: kubectl drain swarm1 --delete-local-data --force --ignore-daemonset ...
- sqlserver查询数据表中每个类别最新的一条记录
表tariff_info, 原始数据: 想要的结果:以start_time时间倒序排序, 以code分类, 查询每一类最新的一条记录 sql: SELECT a.* FROM TARIFF_INFO ...
- ajax, jQuery, jQueryeasyUI
1.ajax与jQueryajax是jquery库里面的一个被封装好的函数,可以拿来直接使用.没有jquery的话,ajax的使用就得用原生的javascript去写,比较麻烦. 2.jQuery E ...
- linux磁盘相关命令
一.查看文件夹大小du du -h -d1 2>/dev/null 解释: h表示以可读性较好的方式显示,即带单位显示 d表示深度depth,为1表示只显示当前目录下文件的大小 2>/de ...
- 【虚拟化系列】VMware vSphere 5.1 网络管理
网络是VMware vSphere 5.1的基础,所有虚拟机都需要网络来进行通信.如果将所有的虚拟机都看成是物理机,则在网络拓扑上,需要网卡和交换机等不同的网络连接设备和方式.而在虚拟化中,这些 ...
- Linux 日志切割工具cronolog详解
一.前言 二.cronolog 简介 三.cronolog 特点 四.cronolog 安装 五.cronolog 使用 六.cronolog 总结 注,操作系统 CentOS 6.4 x86_64, ...
- Android 获取包名,版本信息
Android 获取包名,版本信息及VersionName名称 <span style="font-size: 14px;">private String ge ...
- block(四)揭开神秘面纱(下)-b
看此篇时,请大家同时打开两个网址(或者下载它们到本地然后打开): http://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/BlocksRuntim ...
- Docker 的技术组件
Docker可以运行于任何安装了现代Linux内核的x64主机上.推荐的内核版本是3.8或者更高.Docker的开销比较低,可用于服务器.台式机或者笔记本.它包括以下几个部分. 一个原生的Linux容 ...
- Oracle 12C -- Invisible Columns
在12C中,当一个列被定义为"不可见"的时候,没有直接访问该列的sql语句是无法看到"不可见列"的,显式引用"不可见列"的语句是可以访问和操 ...