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; } }