标签:case har get asc color int put ring using
4 3
1 2 3 4
5 7
33 6
12 8
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"); } }
标签:case har get asc color int put ring using
原文地址:http://www.cnblogs.com/TheRoadToTheGold/p/6219098.html