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