[数据结构应用][1] 抽象数据类型 (ITP1_11_D Dice)

Introduction

编写一个程序,读取以与图片显示相同的方式构造的n个骰子,并确定它们是否全部不同。
Graph 1

Input

在第一行中,给出了骰子数n。在接下来的n行中,分配给骰子面的六个整数按照其相应标签的升序给出。

Output

如果给定的骰子全部不同,则打印“Yes”,否则打印“No”。

Constraints

  1. 2 ≤ n ≤ 100
  2. 0 ≤ 骰子上的数字 ≤ 100

Samples

Sample Input 1
3
1 2 3 4 5 6
6 2 4 3 5 1
6 5 4 3 2 1

Sample Output 1
No
Sample Input 2
3
1 2 3 4 5 6
6 5 4 3 2 1
5 4 3 2 1 6

Sample Output 2
Yes

Answer

# include<bits/stdc++.h>
using namespace std;
struct dice
{   int f[7],f0[7];
    void r(int a,int b,int c,int d){
        int t;
        t = f[a];
        f[a] = f[d];
        f[d] = f[c];
        f[c] = f[b];
        f[b] = t;
    }
    void roll(char cmd){
        switch (cmd){
        case 'S': r(1,2,6,5); break;
        case 'N': r(1,5,6,2); break;
        case 'W': r(1,4,6,3); break;
        case 'E': r(1,3,6,4); break;    
        case 'R': r(2,3,5,4); break;
        }
    }
    void MvTop(int n){
        switch (n){
        case 2: roll('N'); break;
        case 3: roll('E'); break;
        case 4: roll('W'); break;
        case 5: roll('S'); break;
        case 6: roll('N'); roll('N'); break;
        default: break;
        }
    }
    void copy(){
        for(int i=1;i<=6;i++)
            f0[i] = f[i];
    }
    void back(){
        for(int i=1;i<=6;i++)
            f[i] = f0[i];
    }
    bool e(dice d){
        for(int i=1;i<=6;i++)
            if(f[i]!=d.f[i]) return 0;
        return 1;
    }
    bool equal(dice d){
        copy();
        for(int i=1;i<=6;i++){
            MvTop(i);
            for(int j=1;j<=4;j++){
                roll('R');
                if(e(d)) return 1; 
            }
            back();
        }
        return 0;
    }
} d[101];
bool AllDiff(int a,int n){
    if(a==n) return 1;
    for(int i=a+1;i<=n;i++)
        if( d[a].equal(d[i]) )
            return 0;
    return AllDiff(a+1,n);
}
int main(){
    int n;
    cin>>n;
    for(int k=1;k<=n;k++)
        for(int i=1;i<=6;i++)
            cin>>d[k].f[i];
    cout<<(AllDiff(1,n) ? "Yes\n":"No\n");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值