//一维数组解法(注释详尽)
//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. 列表推导式,两个for循环的例子

    [a for a in alist for b in blist if a>b] for i in alist,blist: print(i) >>  alist[] >> ...

  2. Django-rest-framework多条件查询/分页/多表Json

    http://www.mamicode.com/info-detail-1648765.html

  3. linux系统无法挂载U盘

    插上U盘 [ 2407.650440] usb 1-3.3: new high speed USB device number 7 using s5p-ehci [ 2407.887332] usb ...

  4. Avro之一:Avro简介

    一.引言 1. 简介 Avro是Hadoop中的一个子项目,也是Apache中一个独立的项目,Avro是一个基于二进制数据传输高性能的中间件.在Hadoop的其他项目中例如HBase(Ref)和Hiv ...

  5. Vue.js:template

    ylbtech-Vue.js: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   1 ...

  6. 1138 Postorder Traversal

    题意:给出二叉树的前序序列后中序序列,输出其后序序列的第一个值. 思路:乍一看不就是前序+中序重建二叉树,然后后序遍历嘛!这么做当然不会有错,但是却没有真正领会本题的意图.本题并不是让我们输出后序序列 ...

  7. UE4动画功能整理

    转自:http://blog.ch-wind.com/ue4%E5%8A%A8%E7%94%BB%E5%8A%9F%E8%83%BD%E6%95%B4%E7%90%86/ 工欲善其事必先利其器,最近一 ...

  8. java中抽象类跟接口的区别

    额,好吧,本来是打算转载些神马的,但是搜资料的过程中发现了一个专注与java的人,那就关注啦,以后多进他blog学习学习:http://www.cnblogs.com/chenssy/p/337670 ...

  9. catkin 工作空间 - Package 组成

    package 是 ROS 软件的基本组织形式,ROS 就是由一个个的 package 组成的 package 是 catkin 的编译基本单元 一个 package 可以包含多个可执行文件(节点) ...

  10. linux之fstab文件详解

    /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改. 当系统启 ...