http://acm.pku.edu.cn/JudgeOnline/problem?id=1219
Код:
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
#include <sstream>
using namespace std;
bool DEBUG=false;
const int MAX_GUESSES=6;
struct game {
string word;
vector<string> guesses;
};
istream& operator>>(istream& in, game& g)
{
string line;
getline(cin, line);
{
istringstream in(line);
in >> g.word;
}
if(g.word=="LINGO")
return in;
while(true) {
getline(cin, line);
if(line=="")
return in;
string guess;
{
istringstream in(line);
in >> guess;
}
g.guesses.push_back(guess);
}
}
bool guess_valid(string guess)
{
if(guess.size() != 5)
return false;
for(int i=0; i<5; ++i) {
if(!isupper(guess[i]))
return false;
}
if(DEBUG) cout << guess << " is valid.\n";
return true;
}
string eval_guess(string guess, string word)
{
string result = ".....";
for(int i=0; i<5; ++i) {
if(guess[i]==word[i])
result[i] = guess[i];
}
if(DEBUG) cout << "Correct letters: " << result << endl;
for(int i=0; i<5; ++i) {
if(guess[i] != result[i]) {
if(count(word.begin(), word.end(), guess[i])
- count(result.begin(), result.end(), guess[i])
- count(result.begin(), result.end(), tolower(guess[i]))
>0) {
result[i] = tolower(guess[i]);
}
}
}
if(DEBUG) cout << "All letters: " << result << endl;
return result;
}
int main()
{
{ string trash; getline(cin, trash); }
while(true) {
game g;
cin >> g;
if(g.word=="LINGO")
break;
cout << endl;
string prev_result = g.word[0] + string("....");
cout << prev_result << endl;
for(unsigned int i=0; i<g.guesses.size(); ++i) {
if(guess_valid(g.guesses[i])) {
prev_result = eval_guess(g.guesses[i], g.word);
}
if(prev_result == g.word) {
cout << prev_result << endl;
break;
}
if(i+1==MAX_GUESSES)
break;
cout << prev_result << endl;
}
if(prev_result != g.word) {
for(int i=0; i<5; ++i)
cout << char(tolower(g.word[i]));
cout << endl;
}
}
}