全排列问题
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e6+10;
int n;
int vis[N];
int anw[N];
vector<int > e[N];
void dfs(int now,int idx)
{
anw[idx] = now;
if(idx==n)
{
for(int i = 1;i<=n;i++) printf("%5d",anw[i]);
printf("\n");
}
for(int i = 1;i<=n;i++)
{
if(vis[i]==0)
{
vis[i]=1;
dfs(i,idx+1);
vis[i] = 0;
}
}
}
signed main()
{
cin>>n;
dfs(0,0);
return 0;
}
医院设置
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e6+10;
int n;
int va[N];
int vis[N];
int sum = 0,minn = 1e18;
vector<int > e[N];
void dfs(int now,int dep)
{
vis[now] = 1;
sum += va[now]*(dep-1);
for(auto spot:e[now])
{
if(vis[spot]==0) dfs(spot,dep+1);
}
}
signed main()
{
cin>>n;
for(int i =1;i<=n;i++)
{
int a,b;
cin>>va[i]>>a>>b;
if(a!=0) e[i].push_back(a),e[a].push_back(i);
if(b!=0) e[i].push_back(b),e[b].push_back(i);
}
for(int i=1;i<=n;i++)
{
sum = 0;
for(int j=1;j<=n;j++) vis[j]=0;
dfs(i,1);
minn = min(minn,sum);
}
cout<<minn;
return 0;
}
入门
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e6+10;
int n,m;
char va[25][25];
int vis[25][25];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
void dfs(int x,int y)
{
for(int i=0;i<=3;i++)
{
int xx = x+dx[i],yy = y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&va[xx][yy]=='.'&&vis[xx][yy]==0)
{
vis[xx][yy] = 1;
dfs(xx,yy);
}
}
}
signed main()
{
cin>>m>>n;
int A = 0,B = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>va[i][j];
if(va[i][j]=='@')
{
A = i,B = j;
}
}
}
vis[A][B] = 1;
dfs(A,B);
int sum = 0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
sum += vis[i][j];
}
cout<<sum;
}
PERKET
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e6+10;
int n,m;
int va[N];
int vb[N];
int anw[N];
int minn = 1e18;
void dfs(int now,int idx)
{
anw[idx] = now;
if(idx==n)
{
int sum1 = 1,sum2 = 0,suc = 0;
for(int i=1;i<=n;i++)
{
if(anw[i]==1)
{
suc = 1;
sum1 *= va[i];
sum2 += vb[i];
}
}
if(suc) minn = min(minn,abs(sum1-sum2));
return ;
}
dfs(1,idx+1);
dfs(0,idx+1);
}
signed main()
{
IOS;
cin>>n;
for(int i=1;i<=n;i++) cin>>va[i]>>vb[i];
dfs(0,0);
cout<<minn;
return 0;
}
自然数的拆分问题
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e6+10;
int n,m;
int va[N];
int anw[N];
void dfs(int now,int sum,int idx)
{
anw[idx] = now;
if(sum==n)
{
for(int i=1;i<=idx;i++)
{
cout<<anw[i];
if(i!=idx) cout<<"+";
}
cout<<"\n";
return ;
}
for(int i=1;i<=min(n-sum,n-1);i++)
{
if(i>=now) dfs(i,sum+i,idx+1);
}
}
signed main()
{
IOS;
cin>>n;
dfs(0,0,0);
return 0;
}
选数
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e6+10;
int n,k;
int va[N];
int vis[N];
int anw[N];
int res = 0;
int check(int x)
{
if(x==1) return false;
for(int i=2;i<=x/i;i++)
{
if(x%i==0) return false;
}
return true;
}
void dfs(int now,int idx,int maxn)
{
anw[idx] = now;
if(idx==k)
{
int sum = 0;
for(int i=1;i<=k;i++) sum = sum+anw[i];
if(check(sum)==true) res++;
return ;
}
for(int i=1;i<=n;i++)
{
if(vis[i]==0&&i>maxn)
{
vis[i] = 1;
dfs(va[i],idx+1,max(maxn,i));
vis[i] = 0;
}
}
}
signed main()
{
IOS;
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>va[i];
dfs(0,0,0);
cout<<res;
return 0;
}
八皇后
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 1e6+10;
struct node{
int x,y;
};
int n;
int res,sum;
node va[N];
int check(int x,int y)
{
for(int i=1;i<=x-1;i++)
{
if(va[i].y==y) return false;
}
for(int i=1;i<=x-1;i++)
{
if(abs(y-va[i].y)==abs(x-va[i].x)) return false;
}
return true;
}
void dfs(int now)
{
if(now==n+1)
{
if(res<3)
{
res++;
for(int i=1;i<=n;i++) cout<<va[i].y<<" ";
cout<<"\n";
}
sum++;
return ;
}
for(int j=1;j<=n;j++)
{
if(check(now,j))
{
va[now] = {now,j};
dfs(now+1);
}
}
}
signed main()
{
cin>>n;
dfs(1);
cout<<sum;
}
奇怪的电梯
#include<bits/stdc++.h>
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define PII pair<int,int >
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N = 200+10;
int n,A,B;
int va[N];
int vis[N];
int dis[N];
int minn = 1e18;
void dfs(int now,int sum)
{
dis[now] = sum;
if(minn<=sum) return ;
if(sum>n) return ;
if(now==B)
{
minn = min(minn,sum);
return ;
}
int up = now+va[now];
int down = now-va[now];
if(up>=1&&up<=n&&vis[up]==0&&sum+1<dis[up])
{
vis[up] = 1;
dfs(up,sum+1);
vis[up] = 0;
}
if(down>=1&&down<=n&&vis[down]==0&&sum+1<dis[down])
{
vis[down] = 1;
dfs(down,sum+1);
vis[down] = 0;
}
}
signed main()
{
IOS;
cin>>n>>A>>B;
for(int i=1;i<=n;i++) cin>>va[i];
for(int i=1;i<=n;i++) dis[i] = 1e18;
dis[A] = 0;
vis[A] = 1;
dfs(A,0);
if(minn==1e18) minn = -1;
cout<<minn;
return 0;
}