zoukankan      html  css  js  c++  java
  • DFS模板题HDU1016

    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.

    http://acm.hdu.edu.cn/data/images/1016-1.gif

    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

    代码:

    //该题思路简单,精髓在于对回溯与数组的灵活使用
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    bool vis[25];
    int num[25],sum,n;
    
    bool is_prime(int x,int y)//判素数
    {
    	int k=x+y;
    	if(k==1)	return false;
    	for(int i=2;i*i<=k;i++)
    		if(k%i==0)	return false;
    	return true;
    }
    void dfs(int sum)
    {
    	if(sum>n)
    		{
    			if(is_prime(num[1],num[n]))//如果头尾相加为素数,说明可行
    				{
    					for(int i=1;i<n;i++)
    						printf("%d ",num[i]);
    					printf("%d
    ",num[n]);
    				}
    		}
    	for(int i=2;i<=n;i++)
    		{
    			if(is_prime(i,num[sum-1])&&!vis[i])
    				{
    					vis[i]=1;
    					num[sum]=i;
    					dfs(sum+1);
    					vis[i]=0;//回溯
    				}
    		}
    }
    
    int main()
    {
    	int cnt=0;
    	while(~scanf("%d",&n))
    		{
    			memset(vis,0,sizeof(vis));
    			vis[1]=1,num[1]=1;//初始化
    			printf("Case %d:
    ",++cnt);
    			dfs(2);
    			printf("
    ");
    		}
    	return 0;
    }
  • 相关阅读:
    函数概述
    Python之购物车实战(练习字典、random函数)
    字典方法
    dict字典练习题
    触发器(游标)给同事老朱写
    SQL之游标实例
    SQL之游标
    Python之for循环之range函数和enumerate函数
    python之购物车(详解list tupe 循环)
    第二周 数据获取与表示 第二节 数据表示 Data representation
  • 原文地址:https://www.cnblogs.com/BlueDoor1999/p/13301390.html
Copyright © 2011-2022 走看看