2031-Hyper Rock-Scissors-Paper

問題概要

巨大なジャンケンをシミュレートしろ.

解法

シミュレートする.

実装(C++)

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

typedef long long int lli;

#define REP(i,x) for(int i=0;i<(int)(x);i++)
#define rep(i,s,x) for(int i=s;i<(int)(x);i++)
#define FOR(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RREP(i,x) for(int i=(x);i>=0;i--)
#define RFOR(i,c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)

string pattern[]={"Rock","Fire","Scissors","Snake","Human","Tree","Wolf","Sponge","Paper","Air","Water","Dragon","Devil","Lightning","Gun"};

int main(){
	for(int n;cin>>n,n;){
		int v[15],d[15],w[15];
		memset(v,0,sizeof(v));
		memset(d,0,sizeof(d));
		memset(w,0,sizeof(w));
		REP(i,n){
			string t;
			cin>>t;
			int k=find(pattern,pattern+15,t)-pattern;
			v[k]=1;
		}
		REP(i,15){
			if(v[i]){
				REP(j,7){
					d[(i+(j+1)+15)%15]=1;
				}
				REP(j,7){
					if(v[(i+(j+1)+15)%15]){
						w[i]=1;
					}
				}
			}
		}
		bool a=false;
		REP(i,15){
			if(v[i]&&d[i]==0&&w[i]){
				cout<<pattern[i]<<endl;
				a=true;
				break;
			}
		}
		if(!a){
			cout<<"Draw"<<endl;
		}
	}
}