ぱーぽーの競プロ記

競技プログラミングに関することを書きます。

AOJ 2031 Hyper Rock-Scissors-Paper

・概要
問題文はこちら
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2031

拡張じゃんけん!!


・解法
やるだけ問題です。


ソースコード

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<complex>
#include<sstream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<cassert>
#include<cstring>
using namespace std;
 
#define REP(i,x,n) for(int i = x ; i < (int)(n) ; i++)
#define rep(i,n) REP(i,0,n)
#define f first
#define s second
#define mp make_pair
#define pb push_back
 
typedef pair<int,int> P;
typedef long long ll;
 
static const int INF = (1 << 29);
static const double EPS = 1e-9;
static const double PI = acos(-1.0);
 
int n;
int table[15][15];
string hand[1000];
map<string,int> name;
 
void init(){
  name["Rock"] = 0;
  name["Fire"] = 1;
  name["Scissors"] = 2;
  name["Snake"] = 3;
  name["Human"] = 4;
  name["Tree"] = 5;
  name["Wolf"] = 6;
  name["Sponge"] = 7;
  name["Paper"] = 8;
  name["Air"] = 9;
  name["Water"] = 10;
  name["Dragon"] = 11;
  name["Devil"] = 12;
  name["Lightning"] = 13;
  name["Gun"] = 14;
    
  memset(table,-1,sizeof(table));
  rep(i,15) table[i][i] = 0;
  for(int i = 0 ; i < 15 ; i++){
    for(int j = i+1 ; j < i+1+7 ; j++) table[i][j%15] = 1;
  }
}
 
string solve(){
  for(int i = 0 ; i < n ; i++){
    int win = 0;
    int lose = 0;
    int draw = 0;
    for(int j = 0 ; j < n ; j++){
      int tmp = table[name[hand[i]]][name[hand[j]]];
      if(tmp==-1){
        lose++;
        break;
      }
      if(tmp==1) win++;
      if(tmp==0) draw++;
    }
    if(lose==0 && win > 0){
      return hand[i];
    }
  }
  return "Draw";
}
 
int main(){
  init();
  while(cin >> n, n){
    rep(i,n){
      cin >> hand[i];
    }
    cout << solve() << endl;
  }
  return 0;
}