結果

問題 No.334 門松ゲーム
ユーザー odan3240odan3240
提出日時 2016-01-15 23:15:40
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 55 ms / 2,000 ms
コード長 2,032 bytes
コンパイル時間 830 ms
コンパイル使用メモリ 94,084 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-09-19 19:27:41
合計ジャッジ時間 1,543 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,812 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 55 ms
6,940 KB
testcase_03 AC 1 ms
6,940 KB
testcase_04 AC 2 ms
6,940 KB
testcase_05 AC 1 ms
6,940 KB
testcase_06 AC 8 ms
6,940 KB
testcase_07 AC 20 ms
6,944 KB
testcase_08 AC 6 ms
6,944 KB
testcase_09 AC 12 ms
6,940 KB
testcase_10 AC 43 ms
6,940 KB
testcase_11 AC 17 ms
6,944 KB
testcase_12 AC 3 ms
6,944 KB
testcase_13 AC 2 ms
6,944 KB
testcase_14 AC 53 ms
6,940 KB
testcase_15 AC 20 ms
6,940 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <algorithm>
#include <functional>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <bitset>
#include <climits>

#define all(c) (c).begin(), (c).end()
#define rep(i,n) for(int i=0;i<(n);i++)
#define pb(e) push_back(e)
#define mp(a, b) make_pair(a, b)
#define fr first
#define sc second

const int INF=100000000;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
using namespace std;
typedef pair<int ,int > P;
typedef long long ll;

int N;
int K[20];
bool ok(int used, int i,int j,int k) {
    if(used>>i&1) return false;
    if(used>>j&1) return false;
    if(used>>k&1) return false;

    return true;
}

bool isKado(int i,int j,int k) {
    if(K[i]==K[j]) return false;
    if(K[j]==K[k]) return false;
    if(K[k]==K[i]) return false;
    vector<int> vec;
    vec.pb(K[i]);
    vec.pb(K[j]);
    vec.pb(K[k]);
    sort(all(vec));
    return vec[1]==K[i] || vec[1]==K[k];
}
string dump_bit(int S) {
    string ret;
    while(S) {
        if(S&1) ret+="1";
        else ret += "0";
        S>>=1;
    }

    return ret;
}
bool dfs(int used,int a) {
    bool ret;
    ret=false;
    bool f=false;
    rep(i,N) rep(j,N) rep(k,N) if(i<j && j<k) if(ok(used,i,j,k)) if(isKado(i,j,k)) {
        if(a%2==1) ret|=!dfs(used|(1<<i)|(1<<j)|(1<<k),a+1);
        else ret|=dfs(used|(1<<i)|(1<<j)|(1<<k),a+1);
        f=true;
    }
    if(!f) ret=a%2;
    else if(a%2==1) ret=!ret;
    //if(a<=2) cout<<string(a,' ')<<"debug: " << dump_bit(used) << ", "<< a<<": "<<ret<<endl;

    return ret;
}
int main() {
    cin>>N;
    rep(i,N) cin>>K[i];
    rep(i,N) rep(j,N) rep(k,N) if(i<j && j<k) if(isKado(i,j,k)) {
        int used = (1<<i) | (1<<j) | (1<<k);
        //printf("%d %d %d\n",i,j,k);
        if(dfs(used,1)) {
            printf("%d %d %d\n",i,j,k);
            return 0;
        }
    }
    cout<<"-1"<<endl;
    return 0;
}
0