HDU2553 N皇后问题——DFS
N皇后问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 32229 Accepted Submission(s): 13874
你的任务是,对于给定的N,求出有多少种合法的放置方法。
8
5
0
题意:中文题。。。。。
思路:非常经典的搜索问题,用DFS来写。在棋盘中的棋,它的上下左右,以及左上,右上,左下,右下都不能有棋。因为是N*N的棋盘要放N个棋,可以知道一定是每一行放一个棋,所以我们可以按行进行搜索,逐一确定每一行的棋放在这一行的哪一个位置。
这样有什么好处呢?这样就可以不用担心会发生两个棋子在同一行的情况了,而且也不用管这一行之前的行的情况了,因为能搜索到这一行,之前的每一个都应该是合法的。
然后如何标记那些位置不能走呢?首先,行不用标记,原因上面说了,列也好办,开一个标记列的数组就行了。
那左下和右下怎么办呢?仔细观察可以发现当前点到左下角45度这一条线路的所有点行数+列数的值都是相等的,而到右下角45度这一条线路行数-列数的值都是相等的,所以我们可以考虑用行和列的和来标记左下,行和列的差来标记右下,这样就是普通的DFS模板了。
这题还有一个坑点,就是n是循环输入的,一组测试数据要DFS很多次,如果直接交的话会超时。因为n<=10,所以可以提前求出n==1到10的答案,存下,然后再输入n的时候直接用就行了。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#define eps 1e-7
#define ll long long
#define inf 0x3f3f3f3f
#define pi 3.141592653589793238462643383279
using namespace std;
int ldown[],rdown[],vcolu[]; //ldown标记左下,rdown标记右下,vcolu标记列
int n,ans[]; void DFS(int all,int cnt)
{
if(cnt == all+) //如果最后一行也已经放了棋子,递归到了n+1行,答案++;
{
ans[all]++;
return;
} for(int i=; i<=all; ++i) //枚举这一行的每一列
{
if(!vcolu[i] && !ldown[cnt+i] && !rdown[+cnt-i]) //如果列,左下,右下都未标记不能走,则这一点可以走
{
vcolu[i] = ; //列标记为不能走
ldown[cnt+i] = ; //左下标记为不能走
rdown[+cnt-i] = ; //右下。。。因为cnt-i可能为负,所以加上10避免
DFS(all,cnt+); //递归搜索下一行
vcolu[i] = ; //回溯
ldown[cnt+i] = ;
rdown[+cnt-i] = ;
}
}
return;
} int main()
{
memset(vcolu,,sizeof(vcolu));
memset(ldown,,sizeof(ldown));
memset(rdown,,sizeof(rdown));
memset(ans,,sizeof(ans));
for(int i=; i<=; ++i) //预处理枚举n为1到10的答案
{
DFS(i,);
}
while(cin>>n)
{
if(n==) break;
cout<<ans[n]<<endl;
}
return ;
}
HDU2553 N皇后问题——DFS的更多相关文章
- [HDU2553]N皇后问题(DFS)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2553 题意 n<=10,输出N皇后问题的方法数. 题解 可以使用各种方法.这里使用DFS. 使用 ...
- HDU2553 N皇后问题---(dfs)
http://acm.hdu.edu.cn/showproblem.php?pid=2553 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在 ...
- hdu2553 N皇后问题(dfs+回溯)
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 八皇后(dfs+回溯)
重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...
- hdu2553 N皇后问题
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDOJ2553-N皇后问题(DFS)
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- n皇后问题<dfs>
n皇后问题指的是: n*n的国际象棋棋盘上摆放n个皇后,使其不能互相攻击, 即任意两个皇后都不能处于同一行.同一列或同一斜线上, 问有多少种摆法. 和一般n皇后问题不同的是,现在棋盘上有可能已经放了一 ...
- 八皇后问题 dfs/递归
#include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; ...
- 蓝桥杯 算法提高 8皇后·改 -- DFS 回溯
算法提高 8皇后·改 时间限制:1.0s 内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8 ...
随机推荐
- bash中常用的快捷键
常用快捷键 ctrl+c 强制终止当前命令 ctrl+l 清屏(clear) ctrl+a 光标移动到命令行行首 ctrl+e 光标移动到命令行行尾 ctrl+u 从光标所在位置删除到行首 ctrl+ ...
- Newtonsoft.Json[C#]
C# Newtonsoft.Json JsonSerializerSettings配置序列化操作 https://blog.csdn.net/u011127019/article/details/72 ...
- zookeeper的概念和基础
1.1ZooKeeper的使命 当开发人员使用ZooKeeper进行开发时,开发人员设计的那些应⽤往往可以看成成组连接到ZooKeeper服务器端的客户端,它们通过ZooKeeper的客户端API连接 ...
- 常用的API接口
主页 :http://api.36wu.com/ GetWeather(实时气象)API 服务地址:http://api.36wu.com/Weather/GetWeather?city=?;如:ht ...
- C# event 事件学习
C# event 事件学习 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-26 章节: 简单事件编写 模拟 WPF 控件传递 ...
- Boost在Linux 64 下的编译
1. 下载最新版的boost wget https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.gz 2. 解压 ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 18—Photo OCR 应用实例:图片文字识别
Lecture 18—Photo OCR 应用实例:图片文字识别 18.1 问题描述和流程图 Problem Description and Pipeline 图像文字识别需要如下步骤: 1.文字侦测 ...
- Python与Go冒泡排序
#!/usr/bin/env python # -*- coding: utf-8 -*- # 冒泡排序法 def bubbling(array): # 时间复杂度:O(n^2) for i in r ...
- Android开发实战之底部Dialog弹出效果
在Android开发中,有很多情况下我们需要使用到对话框,遗憾的是,安卓自带的对话框样式不能满足我们实际的需要,所以往往需要我们自定义对话框,具体做法:写一个对话框继承自Dialog实现他的一个构造方 ...
- UIImage分类,设置边框
#import "UIImage+image.h" @implementation UIImage (image) + (UIImage *)imageWithBorder:(CG ...