题目链接:http://noi.openjudge.cn/ch0113/41/
- 总时间限制: 1000ms 内存限制: 65536kB
- 描述
-
有一个集合M是这样生成的: (1) 已知 k 是集合 M 的元素; (2) 如果 y 是 M 的元素,那么, 2y+1 和 3y+1 都是 M 的元素; (3) 除了上述二种情况外,没有别的数能够成为 M 的一个元素。
问题:任意给定 k 和 x,请判断 x 是否是 M 的元素。这里的 k是无符号整数,x 不大于 100000, 如果是,则输出YES,否则,输出 NO
- 输入
- 输入整数 k 和 x, 逗号间隔。
- 输出
- 如果是,则输出 YES,否则,输出NO
- 样例输入
-
0,22
- 样例输出
-
YES
代码一:深搜
1 #include<cstdio>
2 int k,x;
3 int pd(int k,int x)
4 {
5 if(k>x) return 0;
6 else if(k==x) return 1;
7 return (pd(2*k+1,x)||pd(3*k+1,x));
8 }
9 int main()
10 {
11 scanf("%d,%d",&k,&x);
12 if(pd(k,x)==1) printf("YES");
13 else if(pd(k,x)==0) printf("NO");
14 return 0;
15 }
下面是广搜算法代码,是错的代码:

1 #include <iostream>
2 #include<stdio.h>
3 #include<queue>
4 using namespace std;
5 int bfs(long long k,int x)
6 {
7 long long t1,t2,t3;
8 if(k==x) return 1;
9 else if(k>x) return -1;
10
11 queue<long long> q;
12 q.push(k);
13
14 while(!q.empty())
15 {
16 //printf("%lld\n",q.front());
17 t1=q.front(); q.pop();
18 t2=t1*2+1;
19 t3=t1*3+1;
20 if(t2==x||t3==x) return 1;
21 else if(t2>x&&t3>x) return -1;
22 else
23 {
24 if(t2<x) q.push(t2);
25 if(t3<x) q.push(t3);
26 }
27 }
28 }
29 int main()
30 {
31 long long k;
32 int x;
33 freopen("r.txt","w",stdout);
34 scanf("%lld,%d",&k,&x);
35 printf("%lld %d\n",k,x);
36 int res=bfs(k,x);
37 if(res==1)printf("YES\n");
38 else printf("NO\n");
39 return 0;
40 }
错误原因:
有可能会发生这样一个情况:比较大的数据先入队,然后超x了结果返回-1。其实后面还有小数据没有被测到。
可以按如下方式修改:
1 #include <iostream>
2 #include<stdio.h>
3 #include<queue>
4 using namespace std;
5 int bfs(long long k,int x)
6 {
7 long long t1,t2,t3;
8 if(k==x) return 1;
9 else if(k>x) return -1;
10
11 queue<long long> q;
12 q.push(k);
13
14 while(!q.empty())
15 {
16 //printf("%lld\n",q.front());
17 t1=q.front(); q.pop();
18 t2=t1*2+1;
19 t3=t1*3+1;
20 if(t2==x||t3==x) return 1;
21 else
22 {
23 if(t2<x) q.push(t2);
24 if(t3<x) q.push(t3);
25 }
26 }
27 return -1;
28 }
29 int main()
30 {
31 long long k;
32 int x;
33
34 scanf("%lld,%d",&k,&x);
35 int res=bfs(k,x);
36 if(res==1)printf("YES\n");
37 else printf("NO\n");
38 return 0;
39 }
来源:http://www.cnblogs.com/huashanqingzhu/p/7745662.html
