求助:我用C++做UVaOJ 489为什么老是Wrong Answer啊?

Zhourf-2001 2014-02-08 06:25:08
我测试了许多数据都是正确的,也不存在矛盾现象。


#include <iostream>
using namespace std;

int count_letter(string str) {
int count;
for (int i=0; i<str.length(); ++i) {
bool flag = false;
for (int j=0; j<i; ++j) {
if (str[i]==str[j]) {
flag = true;
break;
} /*if*/
} /*for j*/
if (flag == false) {
count++;
} /*if*/
} /*for i*/
return count;
} /*letter()*/

int main() {
int round;
while (cin>>round, round!=-1) {
string ans, gus;
cin >> ans >> gus;
int letters = count_letter(ans);
int heals = 7;
char jl[50];
int jl_c = 0;
for (int i=0; i<gus.length(); ++i) {
int j; bool flag;
for (j=0, flag=false; j<jl_c; ++j) {
if (gus[i]==jl[j]) {
flag = true;
break;
} /*if*/
} /*for j*/
if (flag==true) {
continue;
} /*if*/
jl[jl_c++] = gus[i];
for (j=0, flag=false; j<ans.length(); ++j) {
if (gus[i]==ans[j]) {
flag = true;
break;
} /*if*/
} /*for j*/
if (flag==false) {
--heals;
if (heals==0) {
cout << "Round " << round << endl;
cout << "You lose." << endl;
break;
} /*if*/
} else {
--letters;
if (letters==0) {
cout << "Round " << round << endl;
cout << "You win." << endl;
break;
} /*if*/
} /*if-else*/
} /*for i*/
if (letters && heals) {
cout << "Round " << round << endl;
cout << "You chickened." << endl;
} /*if*/
} /*while*/
return 0;
} /*main()*/
...全文
192 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhourf-2001 2014-02-09
  • 打赏
  • 举报
回复
谢了!!!终于AC了
孩皮妞野 2014-02-09
  • 打赏
  • 举报
回复
4 cheese cheeeeeeeeeeees 果然,你的程序也不能正确处理这个输入。 下面的程序供参考:

#include <iostream>
#include <string>

using namespace std;

struct problem
{
	int id;
	long letters; // bit map of letters involved
	int missed; // count of wrong guess
	std::string input;
	
	void check()
	{
		const char * msg[]={"win.","chickened out.","lose."};
		cout<<"Round "<<id<<endl<<"You "<<msg[accept_guess(input)]<<endl;
		
	}
	
	void reset()
	{
		letters=missed=id=0;
	}
	
	// return 0 if win
	//        1 if lose
	//        2 if not yet done
	int accept_guess(int bit)
	{
		//letter=1<<(letter-'a');
		if(letters & bit )
			letters &=~bit;
		else
			++missed;
		return letters==0?0: missed>=7 ? 2 : 1; 
	}
	
	// return 0 in case win
	//        1 in case chickened out
	//        2 in case lose
	int accept_guess(const string& s)
	{
		int v;
		int map=0;
		for(unsigned i=0; i<s.length(); ++i)
		{
			int bit=1<<(s[i]-'a');
			if(map&bit)
				continue;
			else
				map|=bit;
			if(1!=(v=accept_guess(bit)))
				break;
		}
		return v;
	}
};

std::istream& operator >>(std::istream& is, problem& p)
{
	p.reset();
	is>>p.id;
	
	if(p.id!=-1)
	{
		do{	
			getline(is,p.input);
		}while(is && p.input.empty());
		for(unsigned i=0; i<p.input.length(); ++i)
		{
			long c=p.input[i]-'a';
			c=1<<c;
			p.letters |= c;
		}
		getline(is,p.input);
	}
	return is;
}

int main()
{
	problem p;
	
	while(cin>>p && p.id!=-1)
		p.check();

	return 0;
}
孩皮妞野 2014-02-08
  • 打赏
  • 举报
回复
输入可能有陷进,比如 1 cheese chesabcdefg 你的会输出lose, 但答案上应该是win. 另外我觉得比较能体现C程序员思维方式的应该是这样 输入串直接处理成bitmap, 什么意思呢?输入可以任意长,但它只能包含26个小写字母,我可以把这26个字母映射到0-25这26个整数,并用一个long(32)的相应位设置与否来判断输入中是否有这个字母。比如对输入 cheese 有c,h,e,s四个不同的字母,分别映射到2,7,4,18四个整数,得到的位图就是 (1<<2) | (1<<7) | (1<<4) | (1<<18) 或二进制0000 0000 0000 0100 0000 0000 1001 0100 或16进制的0x00040094 对给出的猜测串,再相应处理,就是猜对就清掉相应位,如果相应位未设,则错误数加1,如果中间位图变为0,表示已经猜对了,如果错误数到了7,那就是失败了,如果输入串处理完,不对不错,那就是chickened out了。 这里还有个小陷井,因为可能有重复输入,所以简单的用上面的办法来检测,正确的字母,第二次及以后出现时,本来应该忽略,但却导致错误数加一。解决的办法是再加一个位图,相信你能想得到。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧