pku 1016 总是wrong answer,高手们来看看

scau007 2010-07-06 09:47:37
题目大意:就是统计0-9的个数,然后将它们按顺序组成一个新的字符串。比如5553141,有3个5,1一个3,2个1,1个4.按顺序排列后就是 21131435。 一次统计称为一次迭代。最多迭代15次。最后会的出4种结果。

1.第一次迭代得到的结果和源字符串相等,这时输出n is self-inventorying 。

2.从某次迭代开始得到结果不再变化这时输出n is self-inventorying after j steps 。 j为到达不变化的字符串时迭代的次数。

3.以上两种情况之外若得到的字符串与前面某个字符串相同,则进入循环,输出n enters an inventory loop of length k 。k是这两个相同的串之间的距离。

4.若以上3种情况均不满足, 输出n can not be classified after 15 iterations。

将每次输入的字符串迭代15次,存入字符串数组str[],然后比较。

1. 若str[0]==str[1] 则满足上述第一种情况。

2. 1-15循环,若从某个位置开始,一个串与它前面一个串相等,则满足上述第2种情况。

3. 从0-14开始对每个i调用find_loop函数, 函数中从i+1开始对j进行自增, 若str[j]==str[i],则满足上述第3种情况。k=j-i.

4. 以上三种均不满足,均按第4种处理。

输入-1时结束

我的代码:
#include<stdio.h>
#include<string.h>
char arr[85];
int compute(char data[])
{
int i = 0, j, len, k = 0, count[10];
char temp[16][85], arr[85];
strcpy(arr, data);
strcpy(temp[0], arr);
for(k = 0; k < 15; k++)
{
for(i = 0; i < 10; i++)count[i] = 0;
len = strlen(temp[k]);
for(i = 0; i < len; i++)
{
switch(temp[k][i])
{
case '0':count[0]++;break;
case '1':count[1]++;break;
case '2':count[2]++;break;
case '3':count[3]++;break;
case '4':count[4]++;break;
case '5':count[5]++;break;
case '6':count[6]++;break;
case '7':count[7]++;break;
case '8':count[8]++;break;
case '9':count[9]++;break;
default:break;
}//switch
}//统计
for(i = 0, j = 0; i < 10; i++)
{
if(count[i] == 0)continue;
temp[k + 1][j] = count[i] + '0';//printf("a: %c ", temp[k + 1][j]);
temp[k + 1][j + 1] = i + '0';//printf("b: %c \n", temp[k + 1][j + 1]);
j = j+ 2;
}//放人temp[k + 1]
temp[k + 1][j] = '\0';//printf("temp[k + 1]: %s\n", k + 1, temp[k + 1]);
//printf("temp[%d]: %s hh\n", k + 1, temp[k + 1]);
for(i = 0; i <= k; i++)
{
if(strcmp(temp[k + 1], temp[i]) == 0 && k == 0)
{
printf("%s is self-inventorying\n", arr);
return 0;
}//第一种情况
else if(strcmp(temp[k + 1], temp[i]) == 0 && k > 0 && k == i)
{
printf("%s is self-inventorying after %d steps\n", arr, k);
return 0;
}//第二种情况
else if(strcmp(temp[k + 1], temp[i]) == 0)
{
printf("%s enters an inventory loop of length %d\n", arr, k + 1 - i);
return 0;
}//第三种情况
}//for
}//k
printf("%s can not be classified after 15 iterations\n", arr);//第四种情况
return 0;
}
int main()
{
while(1)
{
scanf("%s", &arr);
if(arr[0] == '-')break;
compute(arr);
}
return 0;
}
测试了很多数距都对了,但就是wrong answer,不知哪里错了,高手们帮帮忙啊
...全文
102 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2010-07-07
>我只是说是否有类似的细节可能被lz给忽略。
要举例也挑点正常点的牛角尖。这题是ECNA的题,北美区的出题惯例就是描述不严谨,尤其是非法数据的处理几乎从来不说。但是俺做到现在都没碰到过那种,题目没说怎么处理非法数据但是数据里有非法数据的情况。
回复
XLL19880206 2010-07-07
你这么贴代码,人家不好帮你找错的。思路就是模拟15次,然后判断是第几种情况。
回复
zhaolinger2 2010-07-07
[Quote=引用 4 楼 fancymouse 的回复:]
>至少我找到一个不符合题意的地方:
人家说输入-1结束,没说输入负数结束。也就是说,如果人家输入-2,应该不结束,可你却结束了。

乃从来没做过oj题么?钻这种牛角尖。
[/Quote]

我当然做过,但谁能保证出题人怎么想的呢?人家没说的事情就不应该凭自己主观的去增加一些东西。
这只是个小细节,并不是我钻牛角尖,我只是说是否有类似的细节可能被lz给忽略。
回复
FancyMouse 2010-07-07
>至少我找到一个不符合题意的地方:
人家说输入-1结束,没说输入负数结束。也就是说,如果人家输入-2,应该不结束,可你却结束了。

乃从来没做过oj题么?钻这种牛角尖。
回复
zhaolinger2 2010-07-07
至少我找到一个不符合题意的地方:
人家说输入-1结束,没说输入负数结束。也就是说,如果人家输入-2,应该不结束,可你却结束了。
回复
zhaolinger2 2010-07-07
如果你测了很多数据都对,并且你自己确定程序没问题完全符合题意,要么是你理解错题意,要么是他脑子进水,你应该让他给出判断是否wrong answer的标准,然后一条一条对照你的代码。
回复
coxfilur_2008 2010-07-07
mark
回复
chenchangxiong 2010-07-07

for(i = 0, j = 0; i < 10; i++)
{
if(count[i] == 0)continue;
temp[k + 1][j] = count[i] + '0';//printf("a: %c ", temp[k + 1][j]);
temp[k + 1][j + 1] = i + '0';//printf("b: %c \n", temp[k + 1][j + 1]);
j = j+ 2;
}//放人temp[k + 1]


count[i]可以大于10
可以用sprintf进行字符串赋值
回复
nuciewth 2010-07-07
#include<stdio.h>

typedef struct str{
char s[80];
int count[10];
};
int is_in(str buffer[] ,int &len)
{
int k =0;
for(int i = 0 ; i<=9 ; i++)
{
buffer[len].count[i]=0;
}
for(int i = 0 ; i<=9;i++)
{
int num = buffer[len-1].count[i];
if(num!=0)
{
buffer[len].s[k++] = (num+'0');
buffer[len].s[k++] = (i+'0');
buffer[len].count[num]++;
buffer[len].count[i]++;
}
}
buffer[len++].s[k] = '\0';
//printf("%s\n",buffer[len-1].s);
for(int i = 0 ; i <len-1 ; i++)
{
if(strcmp(buffer[len-1].s,buffer[i].s)==0)
{
return i;
}
}
return -1;
}
int main()
{
char t[80];
str buffer[16];

while(EOF!=(scanf("%s",t)))
{
int len = 1 ;
strcpy(buffer[0].s,t);
for(int i = 0 ; i<=9 ; i++)
{
buffer[0].count[i]=0;
}
for(int i = 0 ; t[i]!='\0';i++)
{
buffer[0].count[t[i]-'0']++;
}
int index = 0;
int i ;
for( i = 1; i<=15 ; i++ )
{
index = is_in(buffer,len);

if(i==1&&index == 0)
{
printf("%s is self-inventorying 。\n",t);
break;
}
else
{
if(index == len-2)
{
printf("%s is self-inventorying after %d steps 。\n",t,index);
break;
}
else
if(index!=-1)
{
printf("%s enters an inventory loop of length %d 。\n",t,i-index);
break;
}
}

}
if(i>=15)
{
printf("%s can not be classified after 15 iterations。\n",t);
}

}
return 0 ;
}
回复
FancyMouse 2010-07-06
000000000000000000000000000000
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告