博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
N皇后问题(DFS)
阅读量:6161 次
发布时间:2019-06-21

本文共 1454 字,大约阅读时间需要 4 分钟。

 N皇后问题

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

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
 

 

Recommend
lcy
DFS + 打表
深搜代码:
1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define LL long long 8 #define MAXI 2147483647 9 #define MAXL 922337203685477580710 #define dg(i) cout << "*" << i << endl;11 using namespace std;12 13 int n, q[11]; //每行一个皇后,第i行的皇后的位置是q[i]14 15 bool check(int r)16 {17 int i;18 for(i = 1; i < r; i++)19 if(q[i] == q[r])20 return false;21 for(i = r - 1; i > 0; i--)22 if(q[i] == q[r] - (r - i) || q[i] == q[r] + r - i)23 return false;24 return true;25 }26 27 //r为将要处理的行28 int DFS(int r)29 {30 if(r == n + 1) return 1;31 int cnt = 0;32 for(q[r] = 1; q[r] <= n; q[r]++)33 {34 if(check(r))35 {36 cnt += DFS(r + 1);37 }38 }39 return cnt;40 }41 42 int main()43 {44 int ans;45 while(scanf("%d", &n) && n)46 {47 memset(q, 0, sizeof(q));48 ans = 0;49 for(q[1] = 1; q[1] <= n; q[1]++)50 {51 ans += DFS(2);52 }53 printf("%d\n", ans);54 }55 return 0;56 }
然后用数组保存起来然后。。。你懂的
 

转载地址:http://amhfa.baihongyu.com/

你可能感兴趣的文章
vs2008中使用gdi+的设置
查看>>
一阶矩、惯性矩和旋转半径
查看>>
迷你MVVM框架 avalonjs 学习教程6、插入移除处理
查看>>
saxReader的列子
查看>>
【转】Android Fragment 基本介绍--不错
查看>>
Switch基本知识
查看>>
maven3实战之设置HTTP代理
查看>>
给 Android 开发者的 RxJava 详解
查看>>
HTML5实现扫描识别二维码/生成二维码
查看>>
php curl上传文件$_FILES为空问题
查看>>
用mobiscroll.js的treelist实现弹出下拉效果
查看>>
struts2标签库的使用
查看>>
今晚的比赛(2011.12.4)
查看>>
以 Ext.Net 1.2.0 为例了解网页测试工具 HttpWatch
查看>>
pl/sql 设置编码
查看>>
Django实战(21):使用内置的Amin管理用户
查看>>
android 时间
查看>>
WinXP利用无线网卡做AP共享上网
查看>>
MySQL 集群
查看>>
[转摘]使用异步方式调用同步方法
查看>>