PKU百炼的1035题,求高手帮小弟看看那里错了,感�...

[复制链接]
查看11 | 回复5 | 2021-1-29 05:13:14 | 显示全部楼层 |阅读模式
题目地址http://poj.grids.cn/practice/1035下面是我的代码,帮忙看看那里错了,自己电脑里运行,试了好多组,每次都很成功额,可在线判断一直WrongAnswer,实在是百思不得其解。小弟QQ670607361#include stdio.h
#include string.h
char dic[10000][16];
char words[50][16];
char wordsCopy[17];
char dicCopy[17];
int i, j, m, n, noDic, noWord, len;
char c;
int IsMatch(char *);
void IsLack();
void IsExcess();
void IsWrongWritten();
int main(void)
{
for (i = 0; ; i++)
{
gets(dic);
if (strcmp(dic, #) == 0)
{
noDic = i;
break;
}
}
for (i = 0; ; i++)
{
gets(words);
if (strcmp(words, #) == 0)
{
noWord = i;
break;
}
}
for (i = 0; inoWord; i++)
{
printf(%s, words);
if (IsMatch(words))
{
printf( is correct\n);
continue;
}
else printf(:);
len = (int)strlen(words);
IsWrongWritten();
IsLack();
IsExcess();
printf(\n);
}
return 0;
}
int IsMatch(char *a)
{
for (j = 0; jnoDic; j++)
if (strcmp(dic[j], a) == 0)return 1;
return 0;
}
void IsLack()
{
for (j = 0; jnoDic; j++)
{
if (dic[j][len+1] != '\0') continue;
for (m = 0; m = len; m++)
{
for (n = 0; n = len; n++)
{
if (n = m)
dicCopy[n] = dic[j][n+1];
else
dicCopy[n] = dic[j][n];
}
if (strcmp(words, dicCopy) == 0)
{
printf( %s, dic[j]);
break;
}
memset(dicCopy, 0, 17);
}
}
}
void IsExcess()
{
for (m = 0; m = len; m++)
{
if (words[m] == words[m+1])continue;
for (n = 0; n = len; n++)
{
if (n = m)
wordsCopy[n] = words[n+1];
else
wordsCopy[n] = words[n];
}
if (IsMatch(wordsCopy))
printf( %s, wordsCopy);
}
memset(wordsCopy, 0, 17);
}
void IsWrongWritten()
{
for (m = 0; mlen; m++)
{
strcpy(wordsCopy,words);
for (c = 'a'; c = 'z'; c++)
{
wordsCopy[m] = c;
if (IsMatch(wordsCopy))
printf( %s, wordsCopy);
}
memset(wordsCopy, 0, 17);
}
}


回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
不好意思,发错一个,这个才是我最终修改的代码#include stdio.h
#include string.h
char dic[10000][16];
char words[50][16];
char wordsCopy[17];
char dicCopy[17];
int i, j, m, n, noDic, noWord, len;
char c;
int IsMatch(char *);
void IsLack();
void IsExcess();
void IsWrongWritten();
int main(void)
{
for (i = 0; ; i++)
{
gets(dic);
if (strcmp(dic, #) == 0)
{
noDic = i;
break;
}
}
for (i = 0; ; i++)
{
gets(words);
if (strcmp(words, #) == 0)
{
noWord = i;
break;
}
}
for (i = 0; inoWord; i++)
{
printf(%s, words);
if (IsMatch(words))
{
printf( is correct\n);
continue;
}
else printf(:);
len = (int)strlen(words);
IsWrongWritten();
IsLack();
IsExcess();
printf(\n);
}
return 0;
}
int IsMatch(char *a)
{
for (j = 0; jnoDic; j++)
if (strcmp(dic[j], a) == 0)return 1;
return 0;
}
void IsLack()
{
for (j = 0; jnoDic; j++)
{
if (dic[j][len+1] != '\0') continue;
for (m = 0; m = len; m++)
{
for (n = 0; n = len; n++)
{
if (n = m)
dicCopy[n] = dic[j][n+1];
else
dicCopy[n] = dic[j][n];
}
if (strcmp(words, dicCopy) == 0)
{
printf( %s, dic[j]);
break;
}
memset(dicCopy, 0, 17);
}
}
}
void IsExcess()
{
for (m = 0; m = len; m++)
{
if (words[m] == words[m+1])continue;
for (n = 0; n = len; n++)
{
if (n = m)
wordsCopy[n] = words[n+1];
else
wordsCopy[n] = words[n];
}
if (IsMatch(wordsCopy))
printf( %s, wordsCopy);
}
memset(wordsCopy, 0, 17);
}
void IsWrongWritten()
{
for (m = 0; mlen; m++)
{
strcpy(wordsCopy,words);
for (c = 'a'; c = 'z'; c++)
{
wordsCopy[m] = c;
if (IsMatch(wordsCopy))
printf( %s, wordsCopy);
}
memset(wordsCopy, 0, 17);
}
}


回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
这样直接贴没注释的代码不是很好,请大概说明一下你的思路,好让版友帮忙解决
另外请看下置底如何发高亮代码nthmlyc (万仞游心) 在 ta 的帖子中提到:不好意思,发错一个,这个才是我最终修改的代码code#includestdio.h#includestring.hchardic[10000][16];charwords[50][16];charwordsCopy[17];chardicCopy[17];inti,j,m,n,noDic,noWord,len;charc;...........................

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层

nthmlyc (万仞游心) 在 ta 的帖子中提到:题目地址http://poj.grids.cn/practice/1035下面是我的代码,帮忙看看那里错了,自己电脑里运行,试了好多组,每次都很成功额,可在线判断一直WrongAnswer,实在是百思不得其解。小弟QQ670607361code#includestdio.h#includestring.hchardic[10000][16];charwords[50][16];charwordsCopy[17];inti,j,m,n,noDic,noWord,len;...........................
好的,我说一下我的思路,就是枚举法啦。IsMatch判断是否与字典中储存的词一样IsWrongWritten判断与字典中储存的词相比是否是一个字母写错方法是每次改掉一个字母,判断是否匹配。IsLack判断与字典中储存的词是否少了一个字母方法是将字典里的词中字母每次删掉一个,看看是否和要判断的词一样。IsExcess判断与字典中储存的词是否多了一个字母方法是每次删掉一个字母。

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
变量定义全是全局变量,连i,j都是,这样很容易出错啊,这样没有出错信息很难找到错在哪,另外在判断有写错字母的时候,可以采用两个单词同时去掉一个字母之后再对比,这样会快一些。nthmlyc (万仞游心) 在 ta 的帖子中提到:好的,我说一下我的思路,就是枚举法啦。IsMatch判断是否与字典中储存的词一样IsWrongWritten判断与字典中储存的词相比是否是一个字母写错方法是每次改掉一个字母,判断是否匹配。IsLack判断与字典中储存的词是否少了一个字母方法是将字典里的词中字母每次删掉一个,看看是否和要判断的词一样。IsExcess判断与字典中储存的词是否多了一个字母方法是每次删掉一个字母。

回复

使用道具 举报

千问 | 2021-1-29 05:13:14 | 显示全部楼层
1voidIsExcess()2{3for(m=0;m=len;m++)4{5if(words[m]==words[m+1])continue;6for(n=0;n=len;n++)7{8if(n=m)9wordsCopy[n]=words[n+1];10else11wordsCopy[n]=words[n];12}13if(IsMatch(wordsCopy))14printf(%s,wordsCopy);15}16memset(wordsCopy,0,17);17}
第5句,即使words[m]==words[m+1],下标m后面的字符也需要往前挪位产生新的wordsCopy。应该注释掉这行,如果没理解错的话。
nthmlyc (万仞游心) 在 ta 的帖子中提到:好的,我说一下我的思路,就是枚举法啦。IsMatch判断是否与字典中储存的词一样IsWrongWritten判断与字典中储存的词相比是否是一个字母写错方法是每次改掉一个字母,判断是否匹配。IsLack判断与字典中储存的词是否少了一个字母方法是将字典里的词中字母每次删掉一个,看看是否和要判断的词一样。IsExcess判断与字典中储存的词是否多了一个字母方法是每次删掉一个字母。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行