英雄会第1回オンラインプログラミングコンテスト:単語ゲーム(C++コード)---miss若塵


問題解決の考え方:http://blog.csdn.net/miss_ruochen/article/details/17199887
ヘッダーファイルを追加するのを忘れないでください.
int who_win (string word, map<string, int>& m)
{
	typedef pair <string, int> Who_Pair;

	int size = word.size();
	if(size < 2)
		return -1;

	if(size == 2)
		return 1;

	if(size == 3) {
		if(word[0] >= word[1] && word[1] >= word[2])
			return 0;
		else
			return 1;
	}

	for(int i = 0; i < size; ++i) {
		if(i != 0 && word[i] == word[i-1])
			continue;
			
		string str = word.substr(0,i)+word.substr(i+1,size-i-1);

		bool flag = true;
		for(int j = 0; j < size-2; ++j) {
			if(str[j] >= str[j+1]) {
				flag = false;
				break;
			}
		}
		if(flag)
			return 1;
	}

	for(int k = 0; k < size; ++k) {
		if(k != 0 && word[k] == word[k-1])
			continue;
			
		string strtmp = word.substr(0,k)+word.substr(k+1,size-k-1);
		map<string, int> :: iterator m_iter;
		m_iter = m.find(strtmp);
		int state;

		if(m_iter == m.end()) {
			state = who_win(strtmp, m);
			m.insert( Who_Pair (strtmp, state) );
		}
		else {
			state = m_iter->second;
		}

		if( !state )
			return 1;
	}
	
	m.insert( Who_Pair (word, 0) );
	return 0;
}

int who (string word)
{
	map<string, int> m;
	typedef pair <string, int> Who_Pair;

	m.insert( Who_Pair ("a",0) );

	return who_win(word, m);
}

なぜ私はwho関数の中でmapに1つの文字'a'を挿入しなければならないのかを忘れて、私は毎回検索する前にmapが空であるかどうかを判断したくないので、頻繁な判断が速度を下げるかどうか分からないので、私はむしろ勝手に何かを挿入して、しかも文字'a'の長さが1で元の考え方の判断に影響しないで、勝手にあげただけです