N皇后问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12279    Accepted Submission(s): 5535

Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。

 
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
 
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
 
Sample Input
1
8
5
0
 
Sample Output
1
92
10
 
Author
cgf
 
Source
知识点:DFS 回溯法(可见http://www.cnblogs.com/ZP-Better/p/4649694.html)
题意:见题目描述(obviously)
思路:DFS 先找状态(目前所在第几行,目前所在第几列,目前已经放置的皇后数量)扩展方式:从第一列到最后一列搜索到合适的位置,最终状态:目前放置的皇后数量等于题目所要求的皇后数量。
重点:1.如何判断2个皇后不允许不允许处在与棋盘边框成45角的斜线上。将棋盘看成坐标图,row1+column1=row2+column2=c(x1+y1=x2+y2=c) or row1-column1=row2-column2=c(x1-y1=x2-y2=c)来判断2个皇后是否在棋盘边框成45角的斜线上。为了满足这个条件还需要将目前这个点与已经放置过的点(需要遍历前面的点)判断才满足。
        2.这题卡时间,又由于数字较小所以要打表将这10种情况用数组存下。
 #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,cnt;
int vis[];//标记数组
int picture[];//用下标来表示行号,自身存储列号。
bool judge(int r,int r2,int c2)//判断2个皇后是否在棋盘边框成45角的斜线上
{
for(int i=;i<=r;i++)//遍历已经放置皇后的点
{
if(i+picture[i]==r2+c2||i-picture[i]==r2-c2)
return false;
}
return true;
}
void dfs(int row,int column,int num)
{
if(num==n)
{
cnt++;
return;
}
for(int i=;i<n;i++)
if(!vis[i]&&judge(row,row+,i))
{
picture[row+]=i;
//printf("%dorz%dorz%d\n",row+1,i,num);
vis[i]=;
dfs(row+,i,num+);
vis[i]=;
}
}
int main()
{
while(~scanf("%d",&n))
{
cnt=;
memset(vis,,sizeof(vis));
memset(picture,,sizeof(picture));
for(int i=;i<n;i++)
{
vis[i]=;
picture[]=i;
dfs(,i,);
vis[i]=;//回溯法:还原标记
}
printf("%d\n",cnt);
}
return ;
}

通过上面代码得到10种情况答案。下面是AC代码

 #include <cstdio>
#include <iostream>
int a[]={,,,,,,,,,,};
int n;
int main()
{
while(~scanf("%d",&n))
{if(n==)
break;
printf("%d\n",a[n]);}
return ;
}

HDOJ2553-N皇后问题(DFS)的更多相关文章

  1. 八皇后(dfs+回溯)

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

  2. n皇后问题<dfs>

    n皇后问题指的是: n*n的国际象棋棋盘上摆放n个皇后,使其不能互相攻击, 即任意两个皇后都不能处于同一行.同一列或同一斜线上, 问有多少种摆法. 和一般n皇后问题不同的是,现在棋盘上有可能已经放了一 ...

  3. 八皇后问题 dfs/递归

    #include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; ...

  4. 蓝桥杯 算法提高 8皇后·改 -- DFS 回溯

      算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB      问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8 ...

  5. HDU2553 N皇后问题——DFS

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. hdu2553N皇后问题(dfs,八皇后)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. n皇后问题--DFS输出棋盘

    N皇后问题 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对 ...

  8. hdu 2553 N皇后问题 (DFS)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. HDOJ2553(2N皇后问题)

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. Console 程序在任务计划程序无法读写文件

    当我们把Console 程序作为Window计划任务的计划任务的操作的时候,我们明明设置了程序的执行权限或者文件夹的读写权限(尝试了所有权限,各种账号读写权限的切换都不好使),但是当我们有读写操作的时 ...

  2. SoupUI接口测试学习分享

    一.SoapUI的使用 我们主要用SoapUI的REST 测试功能来测试我们协议接口.RESTful是一种服务端API的规范,每个资源对应唯一的URI,然后用HTTP的POST.GET.PUT.DEL ...

  3. Cocoa Pods的安装

    CocoaPods是用Ruby实现的,要想使用它首先需要有Ruby的环境.幸运的是OS X系统默认已经可以运行Ruby了,因此我们只需执行以下命令: sudo gem install -n /usr/ ...

  4. 设置root远程连接ubuntu上mysql

    1.安装mysql,如果是root用户,直接执行一下命令.如果非root,则需要用sudo命令 a. apt-get install mysql-server b. apt-get isntall m ...

  5. Oracle 中的Pivoting Insert用法

    1.标准Insert --单表单行插入   语法:   INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...)      ...

  6. mysql免安装版配置与使用方法

    mysql免安装版配置与使用方法      以mysql-noinstall-5.1.6(win32)为例 1>把压缩文件mysql-noinstall-5.1.6-alpha-win32.zi ...

  7. simplify the life ECMAScript 5(ES5)中bind方法简介

    一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...

  8. IT定理:摩尔定理,安迪-比尔定理,反摩尔定理

    前两天在网上不经意间搜到了一本吴军的<浪潮之巅>,讲的是现代国际上计算机界的各大公司的兴衰沉浮,包括AT&T公司与IBM等等,把它当作IT历史书看,到现在已经看了一部分了.其中,我 ...

  9. HTML5新增的拖放API---(一)

    HTML5新增了关于拖放的API,通过API可以让HTML页面的任意元素都变成可拖动的,通过使用拖放机制可以开发出更友好的人机交互的界面. 拖放操作可以分为两个动作:在某个元素上按下鼠标移动鼠标(没有 ...

  10. PHP学习笔记三十【final】

    <?php //final不能去修饰属性(变量) //如果希望类不希望被继承就可以使用final关键字 final class Person() { public function sayHi( ...