1全排列
/**
算法名称: 全排列
详 情 : 旺仔 2020.04.05
算法想法:递归+每一个组合都是一个序列
**/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1000;
int n ;
int P[maxn];
bool HashTable[maxn] ={ false};
void generateP(int index){
if(index == n + 1){
for(int i = 1 ; i <= n ; i ++){
cout<<P[i]<<" ";
}
cout<<endl;
return ;
}
for(int i = 1 ; i <= n ; i ++){
if(HashTable[i] == false){
HashTable[i] =true;
P[index] = i;
generateP(index+1);
HashTable[i] = false;
}
}
}
int main()
{
cin >>n;
memset(P,0,sizeof(P));
generateP(1);
return 0;
}
2 N皇后问题(题目) 好像不打表都是TLE emmm
way1 不带回溯
/**
算法名称: N皇后问题(不采用回溯)
详 情 : 旺仔 2020.04.06
算法想法:递归+每行每列都只能拥有一个皇后
所以每一个有可能的组合,以行或列看都是唯一的一个序列
**/
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 10010;
int n;
int Count = 0; //可能方案的数目
int P[maxn];
bool HashTable[maxn] = {false };
void generateP(int index){
if(index == n + 1){
int flag = 0;
for(int i = 1 ; i <= n ; i ++ )
{
for(int j = i + 1 ; j <= n ;j ++)
{
if(abs(i-j)==abs(P[i]-P[j]))
{
flag = 1;
}
}
}
if(flag == 0)
{
// for(int i = 1 ; i <= n ; i ++){
// cout<<P[i]<<" ";
//}
// cout<<endl;
Count ++;
}
return ;
}
for(int i = 1; i <= n ; i ++){
if(HashTable[i] == false){
HashTable[i] = true;
P[index] = i;
generateP(index + 1);
HashTable[i] = false;
}
}
}
int main()
{
while(cin >> n)
{
Count=0;
memset(P,0,sizeof(P));
memset(HashTable,false,sizeof(HashTable));
generateP(1);
cout<<Count<<endl;
}
return 0;
}
way2 带回溯
/**
算法名称: N皇后问题(采用回溯)
详 情 : 旺仔 2020.04.06
算法想法: 递归+每行每列都只能拥有一个皇后
所以每一个有可能的组合,以行或列看都是唯一的一个序列
回 溯:
**/
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 10010;
int n;
int Count = 0; //可能方案的数目
int P[maxn];
bool HashTable[maxn] = {false };
void generateP(int index){
if(index == n+1){
Count++;
return ;
}
for(int i = 1 ; i <= n ; i++){
if(HashTable[i] == false){
int flag = 0;
for(int pre = 1 ; pre < index ; pre++){
//第index列皇后的行号为x,第pre列皇后的行号为P[pre]
if(abs(index-pre)==abs(i -P[pre])){
flag = 1;
break;
}
}
if(flag== 0 )
{
HashTable[i] = true;
P[index] = i;
generateP(index+1);
HashTable[i] = false;
}
}
}
}
int main()
{
while(cin >> n&&n)
{
Count=0;
memset(P,0,sizeof(P));
memset(HashTable,false,sizeof(HashTable));
generateP(1);
cout<<Count<<endl;
}
return 0;
}