判断元素是否存在

题目链接: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
",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
",k,x);
36     int res=bfs(k,x);
37     if(res==1)printf("YES
");
38     else printf("NO
");
39     return 0;
40 }
广搜,不能AC

错误原因:

有可能会发生这样一个情况:比较大的数据先入队,然后超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
",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
");
37     else printf("NO
");
38     return 0;
39 }
原文地址:https://www.cnblogs.com/huashanqingzhu/p/7745662.html