POJ 1426 搜索进阶

这道题我认为还是比较难的,题意就不是很好理解(英语太渣),然后看了样例整个人就懵逼了,看了一个大神的题解递归懵逼了有木有!!!

后来好好想一下还是搜索,假定一位后,搜索下一位情况,这里下一位要么是0,要么是1,我把它叫做二重搜索哈哈哈哈哈

题解如下(●'◡'●)

题意:给出一个数n,找到一个数m只由0,1组成,使得m是n的倍数;

例如n=6

第一位肯定要置1,1%6 = 1;

10 %6 = 4

11%6 = 5;

100%6 = 4;1000%6 = 4;1001%6 = 5;

101 %6 = 5;1010 %6 = 2;1011%6 = 3;

110 %6 = 2;1100 %6 = 2;1101%6 = 3;

111 %6 = 3;1110%6 = 0;宽搜结束

 

 

 

dfs代码

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #include <queue>
 6 #define MAXN 300005
 7 using namespace std;
 8 int flag;
 9 void dfs(long long int last,int n,int k)
10 {
11     if(flag)
12         return;
13     if(last%n == 0)
14     {
15         flag = 1;
16         printf("%lld\n",last);
17         return ;
18     }
19     if(k == 19)
20         return;
21     dfs(last*10,n,k+1);
22     dfs(last*10+1,n,k+1);
23 }
24 int main()
25 {
26     freopen("caicai.txt","r",stdin);
27     int n;
28     while(~scanf("%d",&n) && n)
29     {
30         flag = 0;
31         dfs(1,n,1);
32     }
33     return 0;
34 }
View Code

bfs

例如n=6

第一位肯定要置1,1%6 = 1;

10 %6 = 4

11%6 = 5;

100%6 = 4;1000%6 = 4;1001%6 = 5;

101 %6 = 5;1010 %6 = 2;1011%6 = 3;

110 %6 = 2;1100 %6 = 2;1101%6 = 3;

111 %6 = 3;1110%6 = 0;宽搜结束

代码

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #include <queue>
 6 #define MAXN 300005
 7 using namespace std;
 8 int ans[MAXN];
 9 
10 int bfs(int n)
11 {
12     queue<long long> q;
13     q.push(1);
14     while(!q.empty())
15     {
16         long long x = q.front();
17         q.pop();
18         if(x%n==0)
19         {
20             printf("%lld\n",x);
21             return 0;
22         }
23         q.push(x*10);
24         q.push(x*10+1);
25     }
26 }
27 
28 int main()
29 {
30     //freopen("caicai.txt","r",stdin);
31     int n;
32     while(~scanf("%d",&n) && n)
33     {
34         bfs(n);
35     }
36     return 0;
37 }
View Code

明天再补。。。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <queue>
#define MAXN 300005
using namespace std;
int ans[MAXN];

int bfs(int n)
{
    queue<long long>q;
    q.push(1);
    while(!q.empty())
    {
        long long x = q.front();
        q.pop();
        if(x%n==0)
        {
            printf("%lld\n",x);
            return 0;
        }
        q.push(x*10);
        q.push(x*10+1);
    }
}

int main()
{
    //freopen("caicai.txt","r",stdin);
    int n;
    while(~scanf("%d",&n) && n)
    {
        bfs(n);
    }
    return 0;
}
posted @ 2016-04-22 19:40  vegetable_vegetable  阅读(151)  评论(0编辑  收藏  举报