codevs 1229 数字游戏

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs 1229 数字游戏相关的知识,希望对你有一定的参考价值。

1229 数字游戏

http://codevs.cn/problem/1229/

题目描述 Description
Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间。  这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两个数字X和K。Lele要做的事情就是重新拼这些纸牌,组成数字 T ,并且 T + X 是 K 的正整数倍。 有时候,当纸片很多的时候,Lele经常不能在一节课之内拼出来,但是他又想知道答案,所以,他想请你帮忙写一个程序来计算答案。  
 
输入描述 Input Description
  1. 第一行包含两个整数 N和M(0<N<9,0<M<2000),分别代表纸片的数目和询问的数目。  
  2. 第二行包含N个整数分别代表纸片上写的数字,每个数字可能取0~9。  
  3. 接下来有M行询问,每个询问给出两个整数X和K(0<=x<10^9,0<K<100)。 
输出描述 Output Description
  1. 对于每次询问,如果能够用这些纸片拼出符合答案的T,就输出结果T。如果有多个结果,就输出符合要求的最小的T。  
  2. 如果不能拼出,就输出"None"。  
样例输入 Sample Input

4 3 

1 2 3 4 

5 7 

33 6 

12 8  

样例输出 Sample Output

1234

None

1324

方便判断可以先让x模k,然后爆搜全排列,挨个判断,数据比较水,过了

因为挨个搜出来的排列是单放在每个数组元素里的,最后需要的是整个数,

可以①,用递归的方法将其转换成一个整数:

int work(i)

{     if(!i) return 0;

     return i+work(i)*10;

}

②,还可以存储的时候用字符存储数字,最后用sscanf(s,"%d",&n),将字符串s转化为n,注意s要从下标0开始使用

我的代码采用的是第二种方法:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10];
char s[10];
int n,m,x,k,d;
bool v[10],ok;
char work(int p)
{
    switch(a[p])
    {
        case 1:return 1;break;
        case 2:return 2;break;
        case 3:return 3;break;
        case 4:return 4;break;
        case 5:return 5;break;
        case 6:return 6;break;
        case 7:return 7;break;
        case 8:return 8;break;
        case 9:return 9;break;
        case 0:return 0;break;
    }
}
bool judge()
{
    sscanf(s,"%d",&d);
    if((d+x)%k==0) return true;
    return false;
}
void dfs(int h)
{
    if(ok) return;
    if(h>n)
    {
        ok=judge();
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(!v[i])
        {
            s[h-1]=work(i);//数字转化为字符,因为s下表要从0开始,所以h-1.注意不能用s[h-1]=char(i),这样得到的是i的ASCLL码 
            v[i]=true;
            dfs(h+1);
            v[i]=false;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&k);
        ok=false;
        x%=k;
        dfs(1);
        if(ok) printf("%d\n",d);
        else printf("None\n");
    }
}

 

以上是关于codevs 1229 数字游戏的主要内容,如果未能解决你的问题,请参考以下文章

codevs 1229 数字游戏

codevs 1085 数字游戏 dp或者暴搜

codevs1085数字游戏(环形DP+划分DP )

codevs1033 蚯蚓的游戏问题

codevs 1085

codevs1358棋盘游戏(状压dp)