第一题:选数
题解:思路还是很简单的,只需要想清楚dfs里的函数都是什么就可以了,还有一个简单的判断素数的函数,这题真没啥难度,就是属于基础题吧,请看AC代码
cpp
#include <stdio.h>
#include <string.h>
#include <math.h>
int n,k,count;
int a[25];
int su(int n)
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
void dfs(int t,int sum,int index)
{
if(t==k)
{
if(su(sum)&&sum!=0)
{
count++;
}
return ;
}
int flag=sum;
for(int i=index;i<n;i++)
{
sum=flag+a[i];
dfs(t+1,sum,i+1);
}
return ;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
dfs(0,0,0);
printf("%d\n",count);
return 0;
}
第二题:奇怪的电梯
题解:这题看到最少按几次按钮,直接BFS就可以,但是我们的判断条件,需要加上是否本来就在当前层,或者说,层数是否在合法范围
cpp
#include <stdio.h>
int n, a, b;
int p[501];
int book[501];
struct que
{
int z;
int step;
} q[1001];
int bfs()
{
int hh=0,tt=1;
int f=0;
q[1].z=a;
q[1].step=0;
while(hh<tt)
{
hh++;
for(int i=1;i<=2;i++)
{
if(i==1)
{
f=q[hh].z+p[q[hh].z];//下一层能走到哪
if(f>0&&f<=n&&book[f]==0)
{
book[f]=1;
tt++;
q[tt].z=f;
q[tt].step=q[hh].step+1;
if(f==b)
{
return q[tt].step;
}
}
}
if(i==2)
{
f=q[hh].z-p[q[hh].z];//下一层能走到哪
if(f>0&&f<=n&&book[f]==0)
{
book[f]=1;
tt++;
q[tt].z=f;
q[tt].step=q[hh].step+1;
if(f==b)
{
return q[tt].step;
}
}
}
}
}
return -1;
}
int main()
{
scanf("%d%d%d", &n, &a, &b);
if(a==b)
{
printf("0\n");
return 0;
}
for (int i = 1; i <= n; i++)
{
scanf("%d", &p[i]);
}
int t = bfs();
printf("%d\n", t);
return 0;
}