第一题:选数
题解:思路还是很简单的,只需要想清楚dfs里的函数都是什么就可以了,还有一个简单的判断素数的函数,这题真没啥难度,就是属于基础题吧,请看AC代码
#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就可以,但是我们的判断条件,需要加上是否本来就在当前层,或者说,层数是否在合法范围
#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;
}