//一维数组解法(注释详尽)
//num皇后可以表示第num列,然后枚举num皇后所在的行
//二维数组对角线转换为坐标的关系
#include<stdio.h>
#include<string.h>
int map[],hang[],ans[];
int n,cnt;
void Dfs(int num)
{
int i,j,k;
if(num>n)
{
cnt++;
return ;
}
for(i=;i<=n;i++)
{
map[num]=i;//第num的皇后在第num列i行
if(!hang[i])//枚举第i行是否可行
{
for(j=;j<num;j++)//枚举前num-1个皇后
{//num就代表列,map[num]就代表num所在的行
if(map[num]-num==map[j]-j||map[num]+num==map[j]+j)
break;
}
if(j==num)
{
hang[i]=;
Dfs(num+);
hang[i]=;
}
}
}
}
int main()
{
int m;
for(n=; n<; n++)
{
memset(hang,,sizeof(hang));
memset(map,,sizeof(map));
cnt=;
Dfs();
ans[n]=cnt;
}
while(scanf("%d",&m)!=EOF&&m)
{
printf("%d\n",ans[m]);
}
return ;
}

单纯二维坐标做法:

#include <stdio.h>
#include <string.h>
int count[];//n的最大范围是10,打表!
int k,cal;//k个大小的棋盘放的数目
int map[][];//棋盘
int dfs(int row,int column)
{
//最后一行也合适,放置数目加1
if(row>k)
{
cal++;
return ;
}
//判断同一列是否有棋子
for(int i=; i<row; i++)
if(map[i][column])
return ;
//判断左上45度是否有棋子
for(int i=row-,j=column-; i>&&j>; i--,j--)
if(map[i][j])
return ;
//判断右上45度是否有棋子
for(int i=row-,j=column+; i>&&j<=k; i--,j++)
if(map[i][j])
return ;
//都通过,该点合适并判断下一行
map[row][column]=;
for(int i=; i<=k; i++)
{
//当dfs(row+1,i,k)为1时,改行为最后一行,棋盘已放满
if(dfs(row+,i))
break;
}
map[row][column]=;
//该点判断完成,恢复后再去判断其他点
return ;
}
int main()
{
int n;
for(k=; k<=; k++)
{
memset(map,,sizeof(map));
cal=;
//count[k]=0;
for(int i=; i<=k; i++)
dfs(,i);
count[k]=cal;
}
while(scanf("%d",&n)!=EOF&&n)
printf("%d\n",count[n]);
return ;
}

hdu 2553 N皇后问题(一维数组详尽解释)的更多相关文章

  1. hdu 2553 N皇后问题 (经典DFS)

    题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...

  2. [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)     ...

  3. HDU 2553 N皇后问题(详细题解)

    这是一道深搜题目!问题的关键是在剪枝. 下面我们对问题进行分析: 1.一行只能放一个皇后,所以我们一旦确定此处可以放皇后,那么该行就只能放一个皇后,下面的就不要再搜了. 2.每一列只能放一个皇后,所以 ...

  4. HDU 2553(N皇后)(DFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=2553 i表示行,map[i]表示列,然后用DFS遍历回溯 可以参考这篇文章: http://blog.csdn. ...

  5. hdu 2553 N皇后问题

    回溯. 一个主对角线,副对角线的技巧 //vis[0][i]表示第i列有没有皇后 vis[1][cur+i]表示副对角线 vis[2][cur-i+n]表示主对角线 #include <cstd ...

  6. HDU 2553 n皇后问题(回溯法)

     DFS Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description ...

  7. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

  8. [ An Ac a Day ^_^ ] hdu 2553 N皇后问题 搜索

    曾经想过一天一AC 坚持下来的确不容易额 (我是没坚持下来 尽量以后坚持…… 经典的N皇后问题 搜索的入门问题 学了这么久竟然一直没敲过 今天敲一下…… 这道题也不是很简单额 纯暴力就超时了 要打一下 ...

  9. hdu 2553 n皇后问题【DFS递归解法】

    <题目链接> 题目大意: Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45 ...

随机推荐

  1. miniofs 配置使用

    1. rpm  // RPM 包下载 https://github.com/minio/minfs/releases/tag/RELEASE.2017-02-26T20-20-56Z // 安装 yu ...

  2. POJ1961:Period

    浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:http://poj.org/problem?id=1961 根据研究发现, ...

  3. Sql 中Collate用法

    今天查询sqlite的时候需要不区分大小写,查了下文档,需要使用collate nocase.顺便学习下collate的用法. collate在sql中是用来定义排序规则的.排序规则其实就是当比较两个 ...

  4. BufferedInputStream与BufferedOutputStream

    BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能:BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入 ...

  5. SQL语言分为五大类

    SQL语言分为五大类:DDL(数据定义语言) - Create.Alter.Drop 这些语句自动提交,无需用Commit提交.DQL(数据查询语言) - Select 查询语句不存在提交问题.DML ...

  6. POJ2478(欧拉函数)

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15242   Accepted: 6054 D ...

  7. 【转】Jmeter安装成功后的目录介绍

    1.bin目录 Jmeter.bat  打开Jmeter主界面 Jmeter使用的日志文件名称被定义到Jmeter.properties中,默认在Jmeter.log可查看日志 2.dosc和prin ...

  8. 1084 Broken Keyboard

    题意:给出两个字符串(有字母,数字和下划线_组成),第一个字符串str1是由键盘输入的字符串,第二个字符串str2是屏幕显示的字符串,问键盘有哪几个按键坏了,根据输入的顺序,输出坏掉的键(仅输出一次) ...

  9. Unity Shader入门精要读书笔记(二)UnityShader概述

    第三章<UnityShader概述>的读书笔记: 1.Unity Shader模板提供了几种选择: 标准光照模型(新添加的基于物理的渲染方法) 不含光照的基本的顶点.片元着色器 屏幕后处理 ...

  10. 支付宝pc端支付接入PHP实现

    引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...