結果

問題 No.74 貯金箱の退屈
ユーザー hitoyozakehitoyozake
提出日時 2018-08-06 16:59:04
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 2,501 bytes
コンパイル時間 2,008 ms
コンパイル使用メモリ 78,136 KB
実行使用メモリ 814,636 KB
最終ジャッジ日時 2024-09-19 18:16:20
合計ジャッジ時間 4,354 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,812 KB
testcase_01 WA -
testcase_02 AC 2 ms
6,940 KB
testcase_03 MLE -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <string>
#include <set>
#include <queue>
#include <vector>

void print_state(std::vector<int> const & s){
    //std::cout << "print: " << std::endl;
    for( int i = 0; i < s.size()-1; ++i){
        std::cout << s[i] << ",";
    }

    std::cout << s.back() << std::endl;
}

int main()
{
    int n = 0;
    std::cin >> n;
    std::vector<int> coins;
    std::vector<int> init_state(n, 0);
    for( int i = 0; i < n; ++i )
    {
        int in = 0;
        std::cin >> in;
        coins.push_back(in);
    }

    for( int i = 0; i < n; ++i )
    {
        int in = 0;
        std::cin >> in;
        init_state[i] = in==1;
    }

    std::queue<std::vector<int>> states_q;

    std::set<std::vector<int>> states;
    states_q.push(init_state);
    
    bool found = false;
    int counter = 0;
    while(!states_q.empty()){
        //std::cout << "start" << std::endl;
        std::vector<int> const s = states_q.front();
        int t = 1;
        for(int i = 0; i < n; ++i )
        {
            t *= s[i];
        }

        if(t==1)
        {
            found=true;
            //states_q.clear();
            break;
        }
        
        //auto const r = states.insert(s);
        states_q.pop();
        if(states.find(s)==states.end())
        {
            states.insert(s);
        
        //if(r.second){
            //知って�?る盤面ではなかっ�?
            //�?番に盤面を生成してqueueに追�?する
            
            for(int i = 0; i < n; ++i)
            {
                int const plus = 0+coins[i]%n;
                int const minus = n+(0-coins[i])%n-1;
                //std::cout << "plus:" << plus %n << std::endl;
                //std::cout << "minus:" << minus %n << std::endl;
                std::vector<int> s_copy = s;
                //std::vector<int> s_copy(n, 0);
                
                
                
                s_copy[(0 + coins[i])%n] = (int)!(s_copy[plus%n] == 1);
                s_copy[minus%n] = (int)!(s_copy[minus%n] == 1);
                //print_state(s_copy);
                states_q.push(s_copy);
                
                //std::cout << "*******" << i << "************" << std::endl;
                
            }
            //std::cout << "end" << std::endl;
        }
        else
        {
            continue;
        }
    }

    if(found)
        std::cout << "Yes" << std::endl;
    else
        std::cout << "No" << std::endl;

    return 0;
}





0