HDU 1016 Prime Ring Problem
在刚刚写完代码的时候才发现我以前交过这道题,可是没有过。
后来因为不理解代码,于是也就不了了之了。
可说呢,那时的我哪知道什么DFS深搜的东西啊,而且对递归的理解也很肤浅。
这道题应该算HDU 2610 Sequence one的简化版,判重也非常简单。
其他也没有什么好说的了,直接上代码吧。
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 using namespace std; 7 8 int prime[41] = {0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0}; 9 bool visited[21]; 10 int n, a[21]; 11 12 void DFS(int dep) 13 { 14 if(dep==n && prime[a[dep-1] + a[0]]) 15 { 16 for(int i = 0; i < dep-1; ++i) 17 printf("%d ", a[i]); 18 printf("%d\n", a[dep-1]); 19 return; 20 } 21 for(int i = 2; i <= n; ++i) 22 { 23 if(!visited[i] && prime[a[dep-1] + i]) 24 { 25 visited[i] = true; 26 a[dep] = i; 27 DFS(dep + 1); 28 visited[i] = false; 29 } 30 } 31 } 32 33 int main(void) 34 { 35 #ifdef LOCAL 36 freopen("1016in.txt", "r", stdin); 37 #endif 38 39 int kase = 0; 40 while(scanf("%d", &n) == 1) 41 { 42 printf("Case %d:\n", ++kase); 43 a[0] = 1; 44 memset(visited, false, sizeof(visited)); 45 DFS(1); 46 puts(""); 47 } 48 return 0; 49 }