HDU 5983(模拟魔方 模拟)

题意是说给定一个 2*2 魔方的各个面的情况,问是否能转动不超过一次使得魔方复原。

思路是先在输入的时候统计一下已完成的面数,要想以最多一次的转动使得魔方复原,那么已完成的面数只能是 2 面或者 6 面,此处可剪枝。

若已完成 6 面,那么一定可以复原;

若已完成 2 面,则要用一次转动完成其他六面,开始这里打算用结构体去存,结果在判断的时候自己混乱了……最终直接定了 24 个变量,a,b,c……w,x,

手动做了个小正方体,太丢人……(但不得不说这种方法挺好的,易于理解,而且不会乱^_^)

代码如下:

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;
  4 bool xu[8];
  5 int main()
  6 {
  7     int times,cnt;
  8     bool wu;
  9     scanf("%d",&times);
 10     while(times--)
 11     {
 12         cnt = 0;
 13         memset(xu,0,sizeof(xu));
 14         scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j,&k,&l,&m,&n,&o,&p,&q,&r,&s,&t,&u,&v,&w,&x);
 15         if(a==b&&b==c&&c==d)
 16         {
 17             ++cnt;
 18             xu[0] = 1;
 19         }
 20         if(e==f&&f==g&&g==h)
 21         {
 22             ++cnt;
 23             xu[1] = 1;
 24         }
 25         if(i==j&&j==k&&k==l)
 26         {
 27             ++cnt;
 28             xu[2] = 1;
 29         }
 30         if(m==n&&n==o&&o==p)
 31         {
 32             ++cnt;
 33             xu[3] = 1;
 34         }
 35         if(q==r&&r==s&&s==t)
 36         {
 37             ++cnt;
 38             xu[4] = 1;
 39         }
 40         if(u==v&&v==w&&w==x)
 41         {
 42             ++cnt;
 43             xu[5] = 1;
 44         }
 45         if(cnt==6) puts("YES");
 46         else if(cnt==2)
 47         {
 48             wu = 0;
 49             if(xu[0]&&xu[2])
 50             {
 51                 if(m==n&&m==u&&m==w)
 52                 {
 53                     if(v==x&&v==e&&v==f)
 54                         if(g==h&&g==r&&g==t)
 55                             if(q==s&&q==o&&q==p)
 56                                 wu = 1;
 57                 }
 58                 else if(m==n&&m==r&&m==t)
 59                 {
 60                     if(q==s&&q==e&&q==f)
 61                         if(g==h&&g==u&&g==w)
 62                             if(v==x&&v==o&&v==p)
 63                                 wu = 1;
 64                 }
 65             }
 66             else if(xu[1] && xu[3])
 67             {
 68                 if(a==b&&a==w&&a==x)
 69                 {
 70                     if(u==v&&u==i&&u==j)
 71                         if(k==l&&k==s&&k==t)
 72                             if(q==r&&q==c&&q==d)
 73                                 wu = 1;
 74                 }
 75                 else if(a==b&&a==s&&a==t)
 76                 {
 77                     if(q==r&&q==i&&q==j)
 78                         if(k==l&&k==w&&k==x)
 79                             if(u==v&&u==c&&u==d)
 80                                 wu = 1;
 81                 }
 82             }
 83             else if(xu[4] && xu[5])
 84             {
 85                 if(a==c&&a==n&&a==p)
 86                 {
 87                     if(m==o&&m==j&&m==l)
 88                         if(i==k&&i==f&&i==h)
 89                             if(e==g&&e==b&&e==d)
 90                                 wu = 1;
 91                 }
 92                 else if(a==c&&a==f&&a==h)
 93                 {
 94                     if(e==g&&e==j&&e==l)
 95                         if(i==k&&i==n&&i==p)
 96                             if(m==o&&m==b&&m==d)
 97                                 wu = 1;
 98                 }
 99             }
100             if(wu) puts("YES");
101             else puts("NO");
102         }
103         else puts("NO");
104     }
105     return 0;
106 }

原文地址:https://www.cnblogs.com/Taskr212/p/9740115.html

时间: 2024-11-11 06:50:55

HDU 5983(模拟魔方 模拟)的相关文章

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

HDU 4608 I-number--简单模拟

I-number Time Limit: 5000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 The I-number of x is defined to be an integer y, which satisfied the the conditions below: 1.  y>x; 2.  the sum of each digit of y(under base 10) is the multiple of 10; 3.  among all

hdu 4831 Scenic Popularity(模拟)

题目链接:hdu 4831 Scenic Popularity 题目大意:略. 解题思路:对于休闲区g[i][0]和g[i][1]记录的是最近的两个景点的id(只有一个最近的话g[i][1]为0),对于景点来说,g[i][0]为-1(表示该id对应的是景点),g[i][1]为该景点的热度值.主要就是模拟,注意一些细节就可以了. #include <cstdio> #include <cstring> #include <cstdlib> #include <alg

hdu 3125 Slash(模拟)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3125 Problem Description The American English slash (/) is a punctuation mark. In the early modern period, in the Fraktur script, which was widespread through Europe in the Middle Ages, one slash(/) repr

hdu 4858 项目管理(vector模拟)

# include <stdio.h> # include <algorithm> # include <string.h> # include <vector> # define N 100005 using namespace std; vector<int>g[N]; int node[N]; int slove(int x) { int sum=0,i; for(i=0;i<g[x].size();i++) { sum+=node[

hdu 4941 STL HASH 模拟

http://acm.hdu.edu.cn/showproblem.php?pid=4941 比赛的时候现学的map的find...以前都是用下标做的,但是map用下标查询的话,如果查询的元素不存在,会插入一个新的元素. 贴一个map查找元素找到和找不到的模板 map<pair<int,int>,int>::iterator it=poshash.find(tmppos);//pair<int,int>poshash; int pp; if(it == poshash.

HDU 4022 Bombing STL 模拟题

手动模拟.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define N 10100 #define inf 1000000010 map<

[BestCoder Round #3] hdu 4907 Task schedule (模拟简单题)

Task schedule Problem Description 有一台机器,并且给你这台机器的工作表,工作表上有n个任务,机器在ti时间执行第i个任务,1秒即可完成1个任务. 有m个询问,每个询问有一个数字q,表示如果在q时间有一个工作表之外的任务请求,请计算何时这个任务才能被执行. 机器总是按照工作表执行,当机器空闲时立即执行工作表之外的任务请求. Input 输入的第一行包含一个整数T, 表示一共有T组测试数据. 对于每组测试数据: 第一行是两个数字n, m,表示工作表里面有n个任务,

hdu 2487 Ugly Windows 模拟

#include <cstdio> #include <iostream> #include <cstring> #include <vector> using namespace std; char map[110][110]; int n,m; #define inf 100000 struct node { int x,y; }; vector <node> nn; int main() { while(1) { int i,j,k; sc