codeforces Restore Cube(暴力枚举)

 1 /*
 2     题意:给出立方体的每个顶点的坐标(是由源坐标三个数某几个数被交换之后得到的!),
 3     问是否可以还原出一个立方体的坐标,注意这一句话:
 4     The numbers in the i-th output line must be a permutation of the numbers in i-th input line!
 5
 6     思路:
 7           我们只要对输入的每一行数据进行枚举每一个排列, 然后检查时候能构成立方体就好了!
 8           检查立方体:找到最小的边长的长度 l, 统计边长为l, sqrt(2)*l, sqrt(3)*l的边长
 9           条数,如果恰好分别为12, 12, 4那么就是立方体了...
10 */
11 #include<iostream>
12 #include<cstdio>
13 #include<cstring>
14 #include<algorithm>
15
16 using namespace std;
17
18 typedef long long LL;
19
20 LL num[8][3], d[70];
21
22 LL dis(int i, int j){
23     return  (num[i][0]-num[j][0])*(num[i][0]-num[j][0]) +
24             (num[i][1]-num[j][1])*(num[i][1]-num[j][1]) +
25             (num[i][2]-num[j][2])*(num[i][2]-num[j][2]);
26 }
27
28
29 void out(){
30     for(int i=0; i<8; ++i){
31         printf("%lld", num[i][0]);
32          for(int j=1; j<3; ++j)
33              printf(" %lld", num[i][j]);
34          printf("\n");
35     }
36 }
37
38 int vis[8][8];
39
40 bool check(){
41     int cnt=0;
42     int cnt1=0, cnt2=0, cnt3=0;
43     LL L=(1LL)<<60;
44     memset(vis, 0, sizeof(vis));
45     for(int i=0; i<8; ++i)
46         for(int j=0; j<8; ++j)
47              if(i!=j && !vis[i][j] && !vis[j][i]){
48                  d[cnt++]=dis(i, j);
49                  vis[i][j]=vis[j][i]=1;
50                  if(L>d[cnt-1])
51                     L=d[cnt-1];
52             }
53     if(L==0) return false;
54     for(int i=0; i<cnt; ++i)
55         if(d[i] == L) cnt1++;
56         else if(d[i] == 2*L) cnt2++;
57         else if(d[i] == 3*L) cnt3++;
58     if(cnt1==12 && cnt2==12 && cnt3==4) return true;
59     return false;
60 }
61
62 bool dfs(int cur){
63     if(cur>=8) return false;
64     sort(num[cur], num[cur]+3);//排序
65     do{
66         if(check()){
67             printf("YES\n");
68             out();
69             return true;
70         }
71         if(dfs(cur+1)) return true;//得到当前的全排列之后,继续向下寻找
72     }while(next_permutation(num[cur], num[cur]+3));//枚举这一个行的每一个全排列
73     return false;
74 }
75
76 int main(){
77     for(int i=0; i<8; ++i)
78         for(int j=0; j<3; ++j)
79             scanf("%lld", &num[i][j]);
80     if(!dfs(0))
81        printf("NO\n");
82     return 0;
83 }
时间: 2024-10-11 18:14:27

codeforces Restore Cube(暴力枚举)的相关文章

Codeforces 464B Restore Cube(暴力)

题目链接:Codeforces 464B Restore Cube 题目大意:给定8个点坐标,对于每个点来说,可以随意交换x,y,z坐标的数值.问说8个点是否可以组成立方体. 解题思路:直接暴力枚举即可,保证一个点的坐标不变,枚举量为67,将上一层判断. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef

Codeforces 425A Sereja and Swaps(暴力枚举)

题目链接:A. Sereja and Swaps 题意:给定一个序列,能够交换k次,问交换完后的子序列最大值的最大值是多少 思路:暴力枚举每一个区间,然后每一个区间[l,r]之内的值先存在优先队列内,然后找区间外假设有更大的值就替换掉. 求出每一个区间的最大值,最后记录下全部区间的最大值 代码: By lab104_yifan, contest: Codeforces Round #243 (Div. 2), problem: (C) Sereja and Swaps, Accepted, #

Codeforces Round #253 (Div. 2)B(暴力枚举)

就暴力枚举所有起点和终点就行了. 我做这题时想的太多了,最简单的暴力枚举起始点却没想到...应该先想最简单的方法,层层深入. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<

Codeforces Round #266 (Div. 2)B(暴力枚举)

很简单的暴力枚举,却卡了我那么长时间,可见我的基本功不够扎实. 两个数相乘等于一个数6*n,那么我枚举其中一个乘数就行了,而且枚举到sqrt(6*n)就行了,这个是暴力法解题中很常用的性质. 这道题找出a和b中最小的那个,然后开始枚举,一直枚举到sqrt(6*n)的向上取整.这样所有可能是答案的情况都有啦.再干别的都是重复的或者肯定不是最小面积的. #include<iostream> #include<cstdio> #include<cstdlib> #includ

CodeForces 742B Arpa’s obvious problem and Mehrdad’s terrible solution (暴力枚举)

题意:求定 n 个数,求有多少对数满足,ai^bi = x. 析:暴力枚举就行,n的复杂度. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <c

CodeForces 200C Football Championship(暴力枚举)

C. Football Championship time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Any resemblance to any real championship and sport is accidental. The Berland National team takes part in the local

Coderforces 633D:Fibonacci-ish(map+暴力枚举)

http://codeforces.com/problemset/problem/633/D D. Fibonacci-ish Yash has recently learnt about the Fibonacci sequence and is very excited about it. He calls a sequence Fibonacci-ish if the sequence consists of at least two elements f0 and f1 are arbi

Gym 101194L / UVALive 7908 - World Cup - [三进制状压暴力枚举][2016 EC-Final Problem L]

题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5930 题意: 现有四支队伍两两打比赛,总共就是打六场比赛,每场比赛赢的队伍可得 $3$ 分,输的队伍得 $0$ 分,平局则两个队各得 $1$ 分. 现在给出四个队伍最终的积分

hdu5616 暴力枚举

2017-08-25 20:08:54 writer:pprp 题目简述: ? HDU 5616? n个砝码,可以放在天平左右两侧或不放? m次询问,每次询问是否可以测出给定重量? 1 ≤ n ≤ 20? 1 ≤ m ≤ 100 这道题采用枚举的思路的话实现起来还是有点困难的, 要实现的功能是对每个砝码进行处理,加到左边, 加到右边,或者是不加 看了大神的代码,感觉很巧妙, 设置了两个标记数组 vis1[2005], vis2[2005] 一个vis1用来记录当前已经可以实现的重量 另一个vis