用DFS从n个数中选出m个数
假设从1-12中选出5个不同的数,问有多少种情况。
不考虑每个数的顺序
两种写法,开始点不同
1)第一种DFS的开始点是以1-12中的一个为起点,然后依次考虑后面的数。
2)第二种是从0开始,0相当于一个虚节点,然后依次考虑后面的数。
一:
#include <bits/stdc++.h>
#include <algorithm>
#include <cmath>
#define mod 1000000007
#define ll long long
using namespace std;
int a[15];
int dis[4][2] = {-1,0,1,0,0,-1,0,1};
int ans = 0;
void dfs(int x,int l)
{
if(l == 5){
for(int i = 1; i <= 12; i++){
if(a[i]) cout << i << " ";
}ans++;
cout << "\n";
return;
}
for(int i = x + 1; i <= 12; i++){
if(!a[i]){
a[i] = 1;
dfs(i,l+1);
a[i] = 0;
}
}
}
int main()
{
for(int i = 1; i <= 12; i++){
a[i] = 1;
dfs(i,1);
a[i] = 0;
}
cout << ans;
return 0;
}
二:
#include <bits/stdc++.h>
#include <algorithm>
#include <cmath>
#define mod 1000000007
#define ll long long
using namespace std;
int a[15];
int dis[4][2] = {-1,0,1,0,0,-1,0,1};
int ans = 0;
void dfs(int x,int l)
{
if(l == 5){
for(int i = 1; i <= 12; i++){
if(a[i]) cout << i << " ";
}ans++;
cout << "\n";
return;
}
for(int i = x + 1; i <= 12; i++){
if(!a[i]){
a[i] = 1;
dfs(i,l+1);
a[i] = 0;
}
}
}
int main()
{
dfs(0,0);
cout << ans;
return 0;
}
考虑顺序:如果n=m,就是全排列
#include <bits/stdc++.h>
#include <algorithm>
#include <cmath>
#define mod 1000000007
#define ll long long
using namespace std;
int a[15],b[15];
int dis[4][2] = {-1,0,1,0,0,-1,0,1};
int ans = 0;
void dfs(int x,int l)
{
b[l] = x;
if(l == 3){
for(int i = 1; i <= l; i++)
cout << b[i] << " ";
ans++;
cout << "\n";
return;
}
for(int i = 1; i <= 3; i++){
if(!a[i]){
a[i] = 1;
dfs(i,l+1);
a[i] = 0;
}
}
}
int main()
{
for(int i = 1; i <= 3; i++){
a[i] = 1;
b[1] = i;
dfs(i,1);
a[i] = 0;
}
cout << ans;
return 0;
}
蓝桥杯2016年决赛
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>
#include <string.h>
#include <cmath>
#include <bitset>
#include <set>
#include <map>
#include <list>
#define ll long long
const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;
const ll ds = 1e15+7;
const double p = 3.141592653589793238462643383;
using namespace std;
int ans = 0;
int a[4] = {2,3,5,8};
int b[4] = {1,4,6,7};
int vis[55] = {0};
void dfs(int sum[][2],int l)
{
if(l >= 4){
int sum1,sum2;
sum1 = sum2 = 0;
for(int i = 0; i < 4; i++){
sum1 += sum[i][0]*sum[i][0];
sum2 += sum[i][1]*sum[i][1];
}
if(sum1 == sum2){
ans++;
return;
}
}
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
if(!vis[i]){
sum[i][0] = a[i]*10+b[j];
sum[i][1] = b[j]*10+a[i];
vis[i] = 1;
dfs(sum,l+1);
vis[i] = 0;
}
}
}
}
int main()
{
int num[5][2];
dfs(num,0);
cout << ans/24;
}