杭电1016深度搜索问题
Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 14061 Accepted Submission(s): 6390
Problem Description
A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime.
Note: the number of first circle should always be 1.
Note: the number of first circle should always be 1.
Input
n (0 < n < 20).
Output
The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.
You are to write a program that completes above process.
Print a blank line after each case.
You are to write a program that completes above process.
Print a blank line after each case.
Sample Input
6 8
Sample Output
Case 1: 1 4 3 2 5 6 1 6 5 2 3 4 Case 2: 1 2 3 8 5 6 7 4 1 2 5 8 3 4 7 6 1 4 7 6 5 8 3 2 1 6 7 4 3 8 5 2
这道题可以通过深度搜索的办法来解决,下面是我的代码,已经通过了AC
//1016 #include <iostream> #include <vector> using namespace std; int result[20];//存放计算的结果 vector<vector<int> > results; int n; //int primes[] = {2,3,5,7,11,13,17,19,23,29,31,37};//共有13个40以内的素数 bool prime[] = {0,0 ,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,1}; bool isPrime(int num) { return prime[num]; } bool isIn(int list[], int len, int num) { for (int i = 0; i < len; ++ i) if (list[i] == num) return true; return false; } void findCircle(int i) { int count =0; for (int j = 2; j <= n; ++ j) if (!isIn(result,i,j) && isPrime(result[i-1] + j)) { result[i] = j; count ++; findCircle(i + 1); } if (count == 0) return; if (i == n - 1 && isPrime(1 + result[n - 1])) { vector<int > temp ; for (int k = 0; k < n ; ++ k) temp.push_back(result[k]); results.push_back(temp); } } int main() { int Case = 0; while(cin >> n) { Case ++; results.clear(); result[0] = 1; findCircle(1); cout << "Case "<<Case<<":"<<endl; for (int i = 0; i < results.size(); ++ i ) { cout << results[i][0]<< " "; for (int j = 1; j < results[i].size() - 1; ++ j) cout << results[i][j]<< " "; cout << results[i][results[i].size() - 1] ;//这里特别注意,最后一个不输出空格 cout << endl; } cout << endl; } return 0; }