1 条题解

  • 0
    @ 2021-6-15 13:08:38

    C :

    #include<stdio.h>
    int main()
    {
    	printf("9 6 5 2 16 ");
    	return 0;
    }
    

    C++ :

    #include <iostream>
    #include <cstring>
    using namespace std;
    #define  N 19
    #define  M 5
    bool vis[N+1];
    int a[16];
    bool valid(int t)//判断计算出来的数t是否合法 
    {
    	if(t>19||t<1) return false; 
    	if(vis[t]) return false;//已使用,则不合法。 
    	vis[t] =true;//合法,则标记其被使用了 
    	return true;//合法 
    } 
    void perms(int p[],int start) //从数组p中索引号为start的元素开始进行全排列
    {
    	int i,t;
    	if(start==M)
    	{
    		for(i=0;i<5;i++) 
    		{
    			a[i] = p[i];
    			vis[p[i]] = true;
    		}
    
    		t = 38-15-a[0];
    		if (valid(t)) a[6] = t;
    		else return;
    		
    		t = 38-10-a[1];
    		if (valid(t)) a[10] = t;
    		else return;
    		
    		t = 38-a[6]-a[2];
    		if (valid(t)) a[11] = t;
    		else return;
    		
    		t = 38-a[2]-a[3];
    		if (valid(t)) a[15] = t;
    		else return;
    		
    		t = 38-a[3]-a[10];
    		if (valid(t)) a[14] = t;
    		else return;
    		
    		t = 38-13-a[4]-a[11];
    		if (valid(t)) a[7] = t;
    		else return;
    		
    		t = 38-a[0]-a[1]-a[4];
    		if (valid(t)) a[5] = t;
    		else return;
    		
    		t = 38-a[0]-a[7]-a[15];
    		if (valid(t)) a[12] = t;
    		else return;
    		
    		t = 38-13-a[5]-a[14];
    		if (valid(t)) a[9] = t;
    		else return;
    		
    		t = 38-a[11]-a[12]-a[14];
    		if (valid(t)) a[13] = t;
    		else return;
    		
    		t = 38-a[6]-a[7]-a[9]-a[10];
    		if (valid(t)) a[8] = t;
    		else return;
    		
    		//if(15+a[4]+a[8]+a[13]+a[3]!=38) return;//这三行可不判断 
    		//if(10+a[5]+a[8]+a[12]+a[2]!=38) return;
    		//if(a[1]+a[9]+a[13]+a[15]!=38) return;
    		
    		for(i=6;i<=10;i++)
    			cout<<a[i]<<" ";
    		return;
    	}
    	for(i=start;i<N;i++) 
    	{
    		swap(p[i],p[start]);
    		perms(p,start+1);
    		memset(vis,false,sizeof(vis));//
    		vis[10] = vis[13] = vis[15]=true;//
    		swap(p[start],p[i]);
    	}
    }
    int main()
    {
    	int p[N];
    	for(int i=0;i<N;i++) 
    		p[i]=i+1;
    	vis[10] = vis[13] = vis[15]=true;
    	perms(p,0);
     	return 0;
    }
    
    
    • 1

    信息

    ID
    865
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者