迭代OJ: 全排列
样例输入
abc
样例输出
abc
acb
bac
bca
cab
cba
- code:
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int Q[100];
//用来存放皇后,转换为二维矩阵,元素坐标为(i, Q[i])
int N;
void NQueen(int k, string sl);
int main(){
string s;
cin >> s;
N = s.length();
NQueen(0, s); //从第0行开始摆皇后
return 0;
}
void NQueen(int k, string sl){
//在0 ~ k-1行皇后已经摆好的情况下,摆第k行即其后的皇后
int i;
if(k == N){
for(int i = 0; i < N; ++i)
cout << sl[Q[i]];
//将每个皇后串作为输入字符串的下标,将字符的全排列输出(去重后的)
cout <<endl;
return ;
}
for(int i = 0; i < N; ++i){ //逐渐尝试第k个皇后的位置
int j;
for(j = 0; j < k; ++j){
//和前面k个皇后比较是否冲突
if(Q[j] == i)
break; //冲突 则试下一个位置
}
if(j == k){
//未发生冲突,该点(k, i)可取
Q[k] = i; //将第k个皇后摆在位置i
NQueen(k+1, sl);
}
}
}