A
#include <bits/stdc++.h>
using namespace std;
int n,a[11];
bool vist[11];
void dfs(int x)
{
if(x==n+1)
{
cout <<a[1];
for(int i=2;i<=n;i++)
cout <<" "<<a[i];
cout <<endl;
return ;
}
for(int i=1;i<=n;i++)
{
if(vist[i]==false)
{
a[x]=i;
vist[i]=true;
dfs(x+1);
vist[i]=false;
}
}
}
int main()
{
cin >>n;
dfs(1);
return 0;
}
B
#include <bits/stdc++.h>
using namespace std;
int n,m;
int ans[22];
int vist[22];
void dfs(int x)
{
if(x==m+1)
{
for(int i=1;i<=m;i++)
{
cout <<vist[i]<<" ";
}
cout <<endl;
return ;
}
for(int i=1;i<=n;i++)
{
if(ans[i]==0&&i>vist[x-1])
{
vist[x]=i;
ans[i]=1;
dfs(x+1);
ans[i]=0;
}
}
}
int main()
{
cin >>n>>m;
dfs(1);
return 0;
}
C
这个答案有%17的错误率 现在还不知道哪错了 呜呜呜呜…
#include <bits/stdc++.h>
using namespace std;
int n,k,num;
int a[22];
int b[22];
bool c[22];
bool check(int xx)
{
if(xx<=1)
return false;
for(int i=2;i*i<=xx;i++)
{
if(xx%i==0)
return false;
}
return true;
}
void dfs(int x)
{
if(x==k+1)
{
int sum=0;
for(int i=1;i<=k;i++)
{
sum+=b[i];
}
if(check(sum))
num++;
return ;
}
for(int i=1;i<=n;i++)
{
if(c[i]==0&&a[i]>b[i-1])
{
b[x]=a[i];
c[i]=1;
dfs(x+1);
c[i]=0;
}
}
}
int main()
{
cin >>n>>k;
for(int i=1;i<=n;i++)
cin >>a[i];
dfs(1);
cout <<num <<endl;
return 0;
}
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
bool isprime(int n)
{
if (n<=1)
return false;
for (int i=2;i*i<=n;i++)
if (n%i==0)
return false;
return true;
}//判断素数
int a[22];
int b[22];
int p[22];
bool vis[22];
int n,k,sum,ans;
void dfs(int index)
{
if (index==k+1)
{
if (isprime(sum))
ans++;//看是否加起来是素数
return ;
}
for (int i=1;i<=n;i++)
{
if (vis[i]==false && i>p[index-1])//保证这个排列是按顺序来的,避免重复计算导致答案错误
{
p[index] = i;
vis[i] = true;
sum+=a[i];//最巧妙的地方,,利用全排列的排列过程中,来加上我输入的数字
dfs(index+1);
vis[i] = false;
sum-=a[i];//有加就有减
}
}
}
int main()
{
memset(b,0,sizeof(b));
memset(vis,0,sizeof(vis));
cin>>n>>k;
for (int i=1;i<=n;i++)
cin>>a[i],p[i]=i;//一开始要从第一个排列填好 才开始遍历 ,这与传统的dfs全排列做了点变化
ans=0;
dfs(1);
cout<<ans<<endl;
return 0;
}
D:
#include <bits/stdc++.h>
using namespace std;
int vist[11];
int ans[11];
int n,cot;
int sign;
int flag;
void dfs(int x)
{
if(x==n+1)
{
flag=1;
cout<<vist[1];
for(int i=2;i<=n;i++)
{
cout <<" "<<vist[i];
}
cout <<endl;
return ;
}
for(int i=1;i<=n;i++)
{
vist[x]=i;
sign=1;
for(int j=1;j<x;j++)
{
if(vist[j]==i||(abs(x-j))==(abs(vist[j]-i)))
{
sign=0;
break;
}
}
if(sign) dfs(x+1);
}
}
int main()
{
cin >>n;
dfs(1);
if(!flag) cout <<"no solute!"<<endl;
return 0;
}
E:
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
int n,cot;
void dfs(int num,int pop,int push)
{
if(pop==0&&push==0)
{
cot++;
return ;
}
if(push>0)
dfs(num+1,pop,push-1);
if(pop>0&&num>0)
dfs(num-1,pop-1,push);
}
int main()
{
cin >>n;
dfs(0,n,n);
cout << cot<<endl;
return 0;
}
F
#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
int vist[15][15];
int dis[4][2]={0,-1,-1,0,0,1,1,0};
int mpp[111][2];
int xo,yo;
int xx,yy;
int n,m;
int flag=1;
void dfs(int x,int y,int ans)
{
if(x==xx-1&&y==yy-1)
{
flag=0;
printf("(%d,%d)",xo,yo);
for(int i=0;i<ans;i++)
{
printf("->(%d,%d)",mpp[i][0],mpp[i][1]);
}
cout<<endl;
return ;
}
for(int i=0;i<4;i++)
{
int xxx=x+dis[i][0];
int yyy=y+dis[i][1];
if(vist[xxx][yyy]==1&&xxx>=0&&xxx<n&&yyy>=0&&yyy<m)
{
vist[xxx][yyy]=0;
mpp[ans][0]=xxx+1;
mpp[ans][1]=yyy+1;
dfs(xxx,yyy,ans+1);
vist[xxx][yyy]=1;
}
}
}
int main()
{
cin >>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin >>vist[i][j];
cin >>xo>>yo;
cin >>xx>>yy;
dfs(xo-1,yo-1,0);
if(flag||(xo==xx&&yo==yy))
cout <<"-1"<<endl;
return 0;
}