列表

详情


NC200003. 雷顿女士与限定魔方阵

描述

卡特莉跟随考古队来到古代遗迹,一行人在遗迹中发现了一个谜题。此时正是卡特莉女士的休假时光,所以她希望由你来负责解决这个谜题。

给你一个如图所示的限定魔方阵,并且会给你12个带有数字的石板。

请你在魔方阵的四个角上空缺部分填入合适的石板,使得魔方阵上能被两边的填入数字通过加法或者乘法得到,并且每块石板只能被使用一次。

输入描述

第一行输入一个T(1<=T<=10)表示数据组数。

接下来T组数据。

对于每组数据,第一行输入a,b,c,d,分别表示上、下、左、右的四个数字。

第二行输入12个数表示石板上的数字,数字各不相同。

保证所有输入的数字x,满足1<=x<=100。

对于所有的数据,保证有且仅有一种方案来解决谜题。

输出描述

对于每组数据,请按顺序输出一行包含,分别表示左上、右上、左下、右下填入石板上面的数字。

请注意行末不要输出多余空格。

示例1

输入:

1
36 52 56 35
3 4 5 6 7 8 9 12 13 14 22 28

输出:

14 22 4 13

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 356K, 提交时间: 2019-12-07 14:16:39

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t,num[13];
	cin>>t;
	while(t--)
	{
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		for(int i=1;i<=12;i++)cin>>num[i];
		for(int i=1;i<=12;i++)
		{
			for(int j=1;j<=12;j++)
			{
				for(int ii=1;ii<=12;ii++)
				{
					for(int jj=1;jj<=12;jj++)
					{
						if(i!=j&&i!=ii&&i!=jj&&j!=ii&&j!=jj&&ii!=jj)
						{
							if((num[i]*num[j]==a||num[i]+num[j]==a)&&(num[j]*num[jj]==d||num[j]+num[jj]==d)&&(num[ii]*num[jj]==b||num[ii]+num[jj]==b)&&(num[i]*num[ii]==c||num[i]+num[ii]==c))
							{
								cout<<num[i]<<" "<<num[j]<<" "<<num[ii]<<" "<<num[jj]<<endl;break;
							}
						}
					 } 
				}
			}
		}
	}
	return 0;
}

C(clang 3.9) 解法, 执行用时: 2ms, 内存消耗: 356K, 提交时间: 2019-12-07 13:42:51

#include<stdio.h>
#include<math.h>
#include<string.h>
int main(){
  int T,i,a,b,c,d,g[12],v1,v2,v3,v4,j;
  scanf("%d",&T);
  for(i=0;i<T;i++){
  	scanf("%d %d %d %d",&a,&b,&c,&d);
  	for(j=0;j<12;j++){
  		scanf("%d",&g[j]);
	  }
	for(v1=0;v1<12;v1++){
		for(v2=0;v2<12;v2++){
			for(v3=0;v3<12;v3++){
				for(v4=0;v4<12;v4++){
					if((g[v1]+g[v2]==a||g[v1]*g[v2]==a)&&(g[v2]+g[v4]==d||g[v2]*g[v4]==d)&&(g[v4]+g[v3]==b||g[v4]*g[v3]==b)&&(g[v1]+g[v3]==c||g[v1]*g[v3]==c)&&(g[v1]!=g[v2])&&g[v1]!=g[v3]&&g[v1]!=g[v4]&&(g[v2]!=g[v3])&&g[v2]!=g[v4]&&(g[v3]!=g[v4])){
						printf("%d %d %d %d\n",g[v1],g[v2],g[v3],g[v4]);
					}
				}
			}
		}
	}
  }
  return 0;
}

Python3 解法, 执行用时: 104ms, 内存消耗: 4540K, 提交时间: 2022-04-08 12:24:24

t=int(input())
for _ in range(t):
    a,b,c,d=map(int,input().split())
    ls=list(map(int,input().split()))
    res=[]
    for r in range(12):
        for t in range(12):
            for y in range(12):
                for u in range(12):
                    aa=ls[u]
                    bb=ls[y]
                    cc=ls[t]
                    dd=ls[r]
                    if (aa +bb ==a or aa*bb==a) and (cc+dd==b or cc*dd==b) and (aa+cc==c or aa*cc==c) and (bb+dd==d or bb*dd==d):
                        res.append([aa,bb,cc,dd])
    
    for i in res:
        s=set(i)
        if len(s) ==4:
            print(i[0],i[1],i[2],i[3])

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 344K, 提交时间: 2020-06-20 18:49:11

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
	int t,e,b,c,d,a[12],i,j,k,l;
	cin>>t;
	while(t--)
	{
		cin>>e>>b>>c>>d;
		for(i=0;i<12;i++)
		cin>>a[i];
		for(i=0;i<12;i++)
		{
			for(j=0;j<12;j++)
			{
				for(k=0;k<12;k++)
				{
					for(l=0;l<12;l++)
					{
						if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l)
						{
							if((a[i]+a[j]==e||a[i]*a[j]==e)&&(a[k]+a[l]==b||a[k]*a[l]==b)&&(a[i]+a[k]==c||a[i]*a[k]==c)&&(a[l]+a[j]==d||a[l]*a[j]==d))
							cout<<a[i]<<" "<<a[j]<<" "<<a[k]<<" "<<a[l]<<endl;
						}
					}
				}
			}
		}
	} 
}

上一题