489
这是题目,从别的地方抄的
这是我写的
#include <stdio.h>
#include <string.h>
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif
int n,sign,i,j,k,error,l=0;
char sol[105],guess[105];
while(scanf("%d",&n)&&n!=-1)
{
memset(sol,0,sizeof(sol));
memset(guess,0,sizeof(guess));
error=0;
scanf("%s",sol);
scanf("%s",guess);
while(sol[l++]!='\0');
l--;
for(i=0;i<105&&guess[i]!=0;i++)
{
sign=1;
for(j=0;j<105;j++)
{
if(guess[i]==sol[j])
{
sol[j]=0;
sign=0;
l--;
}
}
if(sign)
{
for(j=i-1;j>=0;j--)
if(guess[j]==guess[i])
sign=0;
if(sign)
error++;
}
if(l==0||error>=7)
break;
}
if(l==0)
printf("Round %d\nYou win.\n",n);
else if(error>=7)
printf("Round %d\nYou lose.\n",n);
else
printf("Round %d\nYou chickened out.\n",n);
}
return 0;
}
这个是我从网上找的能AC的
#include <stdio.h>
#include <string.h>
#define MAX 104
char answer[MAX];
char guess[MAX];
int alpha[MAX];
int main()
{
int a, i, j;
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif
while (scanf("%d", &a) && a != -1)
{
getchar();
int flag, stroke = 0;
memset(alpha, 1, MAX);
gets(answer);
gets(guess);
printf("Round %d\n", a);
for (i = 0; i < strlen(guess); i++)
{
flag = 0;
if (alpha[guess[i] - 'a'])
{
for (j = 0; j < strlen(answer); j++)
if (guess[i] == answer[j])
{
answer[j] = '0';
flag = 1;
}
alpha[guess[i] - 'a'] = 0;
if (!flag)
stroke++;
}
if (stroke == 7)
{
printf("You lose.\n");
flag = 1;
break;
}
flag = 1;
for (j = 0; j < strlen(answer); j++)
{
if (answer[j] != '0')
{
flag = 0;
break;
}
}
if (flag)
{
printf("You win.\n");
break;
}
}
if (!flag)
printf("You chickened out.\n");
}
return 0;
}
虽然我没怎么看这个代码,但这个代码应该说和我的运行情况一样(详见后面)
这是网上找到的另一段代码
但是这段代码对错误我处理与上面那两个不一样,对于重复错误的会重复计算
比如输入
1
cheese
cqqqqqqqqqqqqqqqqqqqqhes
这段代码的结果和上面两个结果是不一样的
可很奇怪的是这段代码也能AC
#include<stdio.h>
#include<string.h>
const int MAXN=1000;
int main()
{
int n,i,j,k;
int ans,flag;
int cas=1;
int len,len_word,len_guess;
char str1[MAXN],str2[MAXN];
while(scanf("%d",&n))
{
ans=flag=len_word=len_guess=0;
if(n==-1) break;
scanf("%s",str1);
scanf("%s",str2);
for (i=0;str1[i];i++)
{
if(str1[i]!=1)
{
for (j=i+1;str1[j];j++)
{
if(str1[i]==str1[j]) str1[j]=1;
}
}
}
len=strlen(str1);
printf("Round %d\n",n);
for (i=0;str1[i];i++)
{
if(str1[i]!=1) len_word++;
}
for (i=0;str2[i];i++)
{
if(str2[i]==2) continue;
for (j=0;str1[j];j++)
{
if(str2[i]==str1[j]) break;
}
if(j==len) ans++;
else
{
len_guess++;
for (j=i+1;str2[j];j++)
{
if(str2[i]==str2[j]) str2[j]=2;
}
}
if(len_word==len_guess)
{
flag=1;
printf("You win.\n");
break;
}
else if(ans==7)
{
flag=1;
printf("You lose.\n");
break;
}
}
if(!flag) printf("You chickened out.\n");
}
return 0;
}
UVaOJ
[解决办法]
while(scanf("%d",&n)&&n!=-1)
{
memset(sol,0,sizeof(sol));
memset(guess,0,sizeof(guess));
error=0;
scanf("%s",sol);
scanf("%s",guess);
while(sol[l++]!='\0');//每次重新输入一组数据的时候要初始化l吧
l--;
for(i=0;i<105&&guess[i]!=0;i++)
{
sign=1;
for(j=0;j<105;j++)//这个地方优化下吧,不要每次都循环105次
{
if(guess[i]==sol[j])
{
sol[j]=0;
sign=0;
l--;
}
}
if(sign)
{
for(j=i-1;j>=0;j--)
if(guess[j]==guess[i])
sign=0;
if(sign)
error++;
}
if(l==0
[解决办法]
error>=7)
break;
}
if(l==0)
printf("Round %d\nYou win.\n",n);
else if(error>=7)
printf("Round %d\nYou lose.\n",n);
else
printf("Round %d\nYou chickened out.\n",n);
}
代码中注释了两处,楼主改了然后试试,其他地方没发现什么错误
[解决办法]
你大while loop里面l没有清零。第二个数据开始的时候l可能是脏数据。