標籤:case har get asc color int put ring using
1229 數字遊戲
http://codevs.cn/problem/1229/
題目描述 DescriptionLele 最近上課的時候都很無聊,所以他發明了一個數字遊戲來打發時間。 這個遊戲是這樣的,首先,他拿出幾張紙片,分別寫上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開始使用
My Code採用的是第二種方法:
#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 數字遊戲