ACM-奇特的立方体

题目描述:奇特的立方体
任意给出8个整数,将这8个整数分别放在一个立方体的八个顶点上,要求检验每个面上的四个数之和相等这个条件能否被满足。

输入

一次输入8个整数

输出

YES或者NO
YES表示可能构成满足条件的立方体
NO则表示不能

样例输入

1 2 3 4 5 6 7 8

样例输出

YES


思路:标记8个顶点的位置,构建子空间树即可。重点是计算每个面的顶点和!!!!!

// 奇特的立方体.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <iostream>
#include <cstring>
using namespace std;

const int MAX = 100;
int n = 8, flag, arr[MAX]/*8个数字*/, vis[MAX]/*8个位置是否放了*/,map[MAX]/*每个位置上方的数字*/;

void printa()
{
    for (int i = 0; i < n; i++) cout << map[i] << " ";
    cout << endl;
}

int check()
{
    //printa();
    int s[6] = { 0 };
    s[0] = map[0] + map[1] + map[2] + map[3];
    s[1] = map[4] + map[5] + map[6] + map[7];
    s[2] = map[0] + map[1] + map[4] + map[5];
    s[3] = map[2] + map[3] + map[6] + map[7];
    s[4] = map[0] + map[3] + map[4] + map[7];
    s[5] = map[1] + map[2] + map[5] + map[6];

    for (int i = 1; i < 6; i++)
    {
        if (s[i - 1] != s[i]) return 0;
    }

    //cout << "sum:" << s[0] << endl;
    return 1;
}


void DFS(int pos)
{
    //cout << "pos:" << pos << endl;
    if (flag) return;
    if (pos >= n)
    {
        if (check()) { flag = 1;}
        return;
    }


    for (int i = 0; i < n; i++)
    {
        if (!vis[i])
        {
            vis[i] = 1;
            map[i] = arr[pos];
            DFS(pos+1);

            vis[i] = 0;
            map[i] = 0;
        }
    }

}

int main()
{
    for (int i = 0; i < n; i++) cin >> arr[i];

    flag = 0;
    memset(vis, 0, sizeof(vis));
    memset(map, 0, sizeof(map));

    DFS(0);

    if (flag) cout << "YES" << endl;
    else cout << "NO" << endl;

    return 0;
}

 





posted @ 2018-03-10 10:17  小小小的程序猿  阅读(194)  评论(0编辑  收藏  举报
window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") }