zoukankan      html  css  js  c++  java
  • 杭电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.


     

    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.
     

    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;
    }
    
    



  • 相关阅读:
    scrapy中selenium的应用
    Django的锁和事务
    redis
    【leetcode】187. Repeated DNA Sequences
    【leetcode】688. Knight Probability in Chessboard
    【leetcode】576. Out of Boundary Paths
    【leetcode】947. Most Stones Removed with Same Row or Column
    【leetcode】948. Bag of Tokens
    【leetcode】946. Validate Stack Sequences
    【leetcode】945. Minimum Increment to Make Array Unique
  • 原文地址:https://www.cnblogs.com/dancingrain/p/3405213.html
Copyright © 2011-2022 走看看