N皇后问题之回溯法
来源:互联网 发布:我的世界手机版恐龙js 编辑:程序博客网 时间:2024/05/21 21:39
N皇后问题
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1850
Sample Output
19210
再使用DFS的时候,递归函数降不再递归调用它自身,而是返回上一层调用,我们称这种现象为回溯。
//author : QJS//First Edit Time:2014-08-04 13:24//Last Edit Time:2014-08-04 13:24#include <stdio.h>#include <iostream>using namespace std;int C[1000];int tot;void search(int cur);int n;int ok;int main(){while (~scanf("%d", &n) && n != 0){tot=0;search(0);//函数传进去的参数为第几行printf("%d\n", tot);}return 0;}void search(int cur){int i, j;if (cur == n){tot++;}else{for (i = 0; i < n; i++){ok = 1;C[cur] = i;//尝试将皇后放入第i列的第cur行for (j = 0; j < cur; j++){if (C[cur] == C[j] || cur - C[cur] == j - C[j] || cur + C[cur] == j + C[j]) //因为是一行一行来放。所以不会遇到两个皇后在同一行的情况。 //所以就只需要比较是否在同一列。而C[xx]数组里面存放值是第几列。 所以判断是否相等。 //而cur - C[cur] == j - C[j]是比较主对角线是否有皇后 //而 cur + C[cur] == j + C[j]是比较副对角线时候有两个皇后存在 //大家可以自己画图就很容易明白。 {ok = 0;break;}}if (ok)//如果放置合法。则继续递归。{search(cur + 1);}}}}
这个第二种方法,效率比第一种高。完美的把回溯法表现出来。
//author : QJS//First Edit Time:2014-08-04 13:24//Last Edit Time:2014-08-04 13:24#include <stdio.h>#include <iostream>using namespace std;int vis[2][100];int tot;void search(int cur);int n;int ok;int main(){while (~scanf("%d", &n) && n != 0){tot=0;search(0);//函数传进去的参数为第几行printf("%d\n", tot);}return 0;}void search(int cur){ int i,j; if(cur==n) tot++; else for(i=0;i<n;i++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]) { vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1; //创建一个二维数组。 //vis[0][i]代表有没有相同的列。 //vis[1][cur+i]代表副对角线有没有两个皇后 //vis[2][cur-i+n]代表主对角线有没有相同的两个皇后 search(cur+1); vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;//切记 一样要改回来。 这就是回溯法的关键所在。 //当你一直找一直找 找到不满足条件的时候。就是一直回溯到原来的位置。 } } }
0 0
- 回溯法之n皇后问题
- 回溯法之n皇后问题
- N皇后问题之回溯法
- 回溯法之N皇后问题
- 回溯法之N皇后问题
- 回溯法之N皇后问题
- n皇后问题-回溯法
- 【回溯法】n皇后问题
- N皇后问题,回溯法
- 回溯法---n皇后问题
- N皇后问题 【回溯法】
- 【回溯法】n皇后问题
- N皇后问题---回溯法
- N 皇后问题-回溯法
- N皇后问题--回溯法
- 回溯法.N皇后问题
- N皇后问题 回溯法
- 回溯法-5.5.1 n皇后问题之递归法
- Android Volley完全解析(四),带你从源码的角度理解Volley
- Linux内核基于端口限速的研究及实现
- POJ-1324 Holedox Moving
- 接口,多态,继承,重载,构造,垃圾回收!学习!
- MYSQL error: Got a packet bigger than ‘max_allowed_packet’ bytes
- N皇后问题之回溯法
- POJ数学题目
- UVA 12232 - Exclusive-OR(带权并查集)
- POJ 3694 Network lca + 并查集
- allocator 的用法
- Android经典面试题大全[陆续完善中......]
- 我的第一篇博客,献给黑马啦。(知识点:构造体,内部类访问权限)
- 进程上下文和中断上下文
- 【成佩涛】测试依旧是测试,常人勿进