Problem 2031 : Hyper Rock-Scissors-Paper

Problem B: Hyper Rock-Scissors-Paper
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=2031

  • 問題概要

15種類手があるジャイケン。やってみたいwww

  • 解法

mapと配列にそれぞれの手を記憶して、あとはif文

  • ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<sstream>
#include<cassert>
#include<queue>
#include<stack>

#define REP(i,b,n) for(int i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define pb         push_back
#define mp         make_pair
#define vint       vector<int>
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)
#define lli	    long long int
#define ld	    long double

using namespace std;
map<string, int> index;
string s[] = {"Rock", "Fire", "Scissors", "Snake", "Human", "Tree", "Wolf", "Sponge", "Paper", "Air", "Water", "Dragon", "Devil", "Lightning", "Gun"};
void makeindex(){
  rep(i, 15)index[s[i]] = i;
}

bool win(int f, int to){
  int d = to - f;
  if(d < 0)d += 15;
  return d <= 7;
}

main(){
  makeindex();
  int n;
  while(cin >> n && n){
    vint v;
    bool used[15];
    rep(i, 15)used[i] = false;
    rep(i, n){
      string s;
      cin >> s;
      int now = index[s];
      if(used[now])continue;
      used[now] = true;
      v.pb(now);
    }
    bool flag = false;
    string ans;
    rep(i, v.size()){
      int cnt = 0;
      rep(j,v.size()){
	if(win(v[i], v[j]))cnt++;
      }
      if(cnt == v.size()){
	ans = s[v[i]];
	flag = true;
      }
    }
    if(flag && v.size() != 1)cout << ans << endl;
    else cout << "Draw" << endl;
  }
}