生活随笔
收集整理的這篇文章主要介紹了
POJ - 3842 An Industrial Spy dfs(水)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:給你一串數字,最少一個,最多七個,問用這里面的數字能組成多少素數,不重復。
思路:之前還遍歷10000000的每一個素數,結果超時,后來發現直接dfs就可以了,只是標記一下做過的數。
1 #pragma comment(linker, "/STACK:1000000000")
2 #include <bits/stdc++.h>
3 #define LL long long
4 #define INF 0x3f3f3f3f
5 #define IN freopen("in.txt","r",stdin)
6 #define OUT freopen("out.txt", "w", stdout)
7 #define MAXN 10000005
8 using namespace std;
9 bool vis[MAXN], done[MAXN], has[
10];
10 int p[
1000005];
11 char s[
10];
12 int cnt[
15], a[
15];
13 int n, ans;
14 void dfs(
int m,
int res){
15 if(done[res])
return;
16 if(!
vis[res]){
17 ans++
;
18 }
19 done[res] =
true;
20 if(m > n)
return;
21 for(
int i =
1; i <= n; i++
){
22 if(has[i])
continue;
23 has[i] =
true;
24 dfs(m +
1, res *
10 + (s[i] -
'0'));
25 dfs(m +
1, res);
26 has[i] =
false;
27 }
28 }
29 int main()
30 {
31 //IN;
32 //OUT;
33 int T;
34 memset(vis,
0,
sizeof(vis));
35 int o =
0;
36 vis[
0] = vis[
1] =
true;
37 for(
int i =
2; i <=
3200; i++
){
38 if(!
vis[i]){
39 p[o++] =
i;
40 }
41 for(
int j =
2 * i; j <=
10000000; j +=
i){
42 vis[j] =
true;
43 }
44 }
45 scanf(
"%d", &
T);
46 while(T--
){
47 //memset(cnt, 0, sizeof(cnt));
48 ans =
0;
49 memset(has,
0,
sizeof(has));
50 memset(done,
0,
sizeof(done));
51 scanf(
"%s", s +
1);
52 n = strlen(s +
1);
53 dfs(
1,
0);
54 printf(
"%d\n", ans);
55 }
56 return 0;
57 }
?
轉載于:https://www.cnblogs.com/macinchang/p/4747861.html
總結
以上是生活随笔為你收集整理的POJ - 3842 An Industrial Spy dfs(水)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。