OJ_1140 八皇后
2014-02-25 22:55
316 查看
#include <iostream> #include <vector> #include <algorithm> using namespace std; int a[93][9]; vector<int> v; int num=0; void swap(int *t,int a,int b) { int temp=t[a]; t[a]=t; t[b]=temp; } bool isOk(int *t) { int i, j; for (i = 1; i <= 8; i ++) { for (j = i + 1; j <= 8; j ++) { if (i - j == t[i] - t[j] || i - j == t[j] - t[i]) return false; } } return true; } void getperm(int *t,int s,int e) { if(s>=e){ if(isOk(t)) { num++; a[num][0]=0; for(int i=1;i<=8;i++){ a[num][0]=a[num][0]*10+t[i]; a[num][i]=t[i]; } v.push_back(a[num][0]); } return; }else{ for(int i=s;i<=e;i++) { swap(t,s,i); getperm(t,s+1,e); swap(t,s,i); } } } void getresult() { for(int i=1;i<=92;i++) { for(int j=1;j<=8;j++) a[i][j]=0; } int t[9]={0,1,2,3,4,5,6,7,8}; // TODO getperm(t,1,8); sort(v.begin(),v.end()); } void output(int n) { /* for(int i=1;i<=8;i++) cout<<a [i]; cout<<endl; */ cout<<v[n-1]<<endl; } void func() { getresult(); int n; while(cin>>n) { for(int i=0;i<n;i++) { int b; cin>>b; output(b); } } } int main(int argc, char *argv[]) { //printf("Hello, world\n"); func(); return 0; }
递归求全排列
[b]题目描述:
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。
输入:
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)
输出:
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。
样例输入:
2 1 92
样例输出:
15863724 84136275
相关文章推荐
- DUI中组合框弹出列表窗口与弹出模态框冲突引起的奔溃问题
- Objective-C的对象模型 http://foredoomed.org/blog/2014/02/24/object-modeling-of-objective-c/
- SiteMesh的使用
- JVM 性能调优
- java四舍五入保留两位小数方法整理
- ZOJ1232 Adventure of Super Mario spfa上的dp
- extjs4视频学习笔记5
- 经济管理
- extjs4视频学习笔记4
- 《STL源码剖析》——迭代器(iterators)概念与traits编程技法(二)
- 选择记录之黄河旋风
- Backup and Restore MySQL Database using mysqlhotcopy
- linux内核调试指南
- 基本数据类型的运算
- 开篇题词
- 算法复习
- Wix打包系列(四) 自定义UI
- Out of socket memory
- Linux Grub菜单添加命令行启动项
- OJ_1139 最大子矩阵