全排列1-3 5种不同写法
#include<iostream>
using namespace std;
const int N = 3;
int cnt = 0, a[20];
int to[20];
void f1()
{
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
for(int k = 1; k <= N; k++)
{
if(i == j || j == k || i == k) continue;
cout << i << " " << j << " " << k << "\n";
cnt++;
}
cout << cnt << "\n";
}
void f2()
{
for(int i = 1; i <= N; i++)
for(int j = 1; j <= N; j++)
{
if(i == j) continue;
for(int k = 1; k <= N; k++)
{
if(i == j || j == k || i == k) continue;
cout << i << " " << j << " " << k << "\n";
cnt++;
}
}
cout << cnt << "\n";
}
void f3()
{
for(int i = 1; i <= N; i++)
{
to[i] = 1;
for(int j = 1; j <= N; j++)
{
if(to[j]) continue;
to[j] = 1;
for(int k = 1; k <= N; k++)
{
if(to[k]) continue;
cout << i << " " << j << " " << k << "\n";
cnt++;
}
to[j] = 0;
}
to[i] = 0;
}
cout << cnt << "\n";
}
void search_1(int t)
{
if(t > N)
{
for(int i = 1; i < N; i++)
cout << a[i] << " ";
cout << a[N] << "\n";
cnt++;
return;
}
for(int i = 1; i <= N; i++)
{
if(to[i]) continue;
a[t] = i;
to[i] = 1;
t++;
search_1(t);
to[i] = 0;
t--;
}
}
void f4()
{
//cnt = 0;
search_1(1);
cout << cnt << "\n";
}
void f5()
{
int t = 1;
while(true)
{
if(t == 0) break;
if(t > N)
{
for(int i = 1; i < N; i++)
cout << a[i] << " ";
cout << a[N] << "\n";
cnt++;
t--;
to[a[t]] = 0;
}
int i;
for(i = a[t] + 1; i <= N; i++)
{
if(to[i] == 1) continue;
a[t] = i;
to[i] = 1;
t++;
break;
}
if(i > N)
{
a[t] = 0;
t--;
to[a[t]] = 0;
}
}
cout << cnt << "\n";
}
int main()
{
//f1();//普通枚举
//f2();//普通剪枝枚举
//f3();//桶数组剪枝枚举
//f4();//递归实现搜索
//f5();//枚举实现搜索
return 0;
}
n与m的全排列
#include<iostream>
using namespace std;
int n, m, cnt = 0;
int a[25];
bool to[25];
void search(int t)
{
if(t > m)
{
for(int i = 1; i <= m; i++)
cout << a[i] << " ";
cout << "\n";
cnt++;
return;
}
for(int i = 1; i <= n; i++)
{
if(to[i]) continue;
a[t] = i;
to[i] = 1;
search(t + 1);
to[i] = 0;
a[t] = 0;
}
}
int main()
{
cin >> n >> m;
search(1);
cout << cnt;
return 0;
}