12.07更新,全部测试数据通过。
在NOI官网拿到了NOIP2016的测试数据,顺便下载下来测试了一下之前写的代码。
在实际测试中遇到第十二组数据出错的情况,这个是我更改后的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <iostream> #include <cstdio> using namespace std; int main () { int n,m,i=0,ans=0,command_1,command_2,flag,x=0; scanf("%d%d",&n,&m); int pan[n]; char job[n][15]; while(i<n) { scanf("%d%s",&pan[i],job[i]); i++; } i=0; while(i<m) { scanf("%d%d",&command_1,&command_2); flag=1; if(pan[x]==command_1) { flag=-1; ans+=command_2*(-1); } else ans+=command_2; x=(x+command_2*flag)%n; if(x<0) x=n+x; i++; } ans=ans%n; if(ans<0) ans=n+ans; printf("%s",job[ans]); }
|
下面是原本的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <iostream> #include <cstdio> using namespace std; int main () { int n,m,i=0,ans=0,command_1,command_2,flag,x=0; scanf("%d%d",&n,&m); int pan[n]; char job[n][10]; while(i<n) { scanf("%d%s",&pan[i],job[i]); i++; } i=0; while(i<m) { scanf("%d%d",&command_1,&command_2); flag=1; if(pan[x]==command_1) { flag=-1; ans+=command_2*(-1); } else ans+=command_2; x=(x+command_2*flag)%n; if(x<0) x=n+x; i++; } ans=ans%n; if(ans<0) ans=n+ans; printf("%s",job[ans]); }
|
把第九行job[n][10]变成了job[n][15],解决第十二组数据的出错的问题,第十七组数据目前还未解决(有可能是数据本身是错的)。
第十二组的问题在于原本的字符数据太短,不足以储存“job”。
这次是为了说明为什么数组短了之后为什么出错。
按照数组的定义,数组实际上是一串连续的变量;
若有这样一个数组char str[4][5];
当使用printf(“%s”,str[0]);输出二维数组,若数组内容如下
|
0 |
1 |
2 |
3 |
4 |
str[0] |
B |
D |
Z |
N |
\0 |
str[1] |
X |
I |
D |
I |
\0 |
str[2] |
A |
B |
C |
D |
\0 |
str[3] |
H |
C |
X |
. |
\0 |
输出内容自然是“BDZN”,若是二维数组内容如下
|
0 |
1 |
2 |
3 |
4 |
str[0] |
B |
D |
Z |
N |
H |
str[1] |
X |
I |
D |
I |
A |
str[2] |
A |
B |
C |
D |
E |
str[3] |
H |
C |
X |
. |
\0 |
输出内容将会是”BDZNHXIDIAABCDEHCX.”,这个与格式化输出控制符”%s”有关系,函数判断一个字符数组的结尾是以“\0”来判断的,它会输出到第一个“\0”前面的那个字符,所以二维数组如果某行被占满,使用“%s”来输出这行内容时,会连带下一行也输出。解决办法是将数组长度增加,防止该行被非”\0”的字符占满。C++的cout与这个类似。
磨磨蹭蹭,12.7更新,调整了一下,发现第十七组的数据错误所在,直接贴出代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include <iostream> #include <cstdio> using namespace std; int main () { freopen("toy.in","r",stdin); freopen("toy.out","w",stdout); int n,m,i=0,ans=0,command_1,command_2; scanf("%d%d",&n,&m); int pan[n]; char job[n][15]; while(i<n) { scanf("%d%s",&pan[i],job[i]); i++; } i=0; while(i<m) { scanf("%d%d",&command_1,&command_2); command_2=command_2%n; if(pan[ans]==command_1) { ans-=command_2; if(ans<=0) ans+=n; } else { ans+=command_2; if(ans>=n) ans-=n; } i++; } printf("%s",job[ans]); }
|
问题其实还是比较明显的,原本的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| while(i<m) { scanf("%d%d",&command_1,&command_2); flag=1; if(pan[x]==command_1) { flag=-1; ans+=command_2*(-1); } else ans+=command_2; x=(x+command_2*flag)%n; if(x<0) x=n+x; i++; }
|
更改后的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| while(i<m) { scanf("%d%d",&command_1,&command_2); command_2=command_2%n; if(pan[ans]==command_1) { ans-=command_2; if(ans<=0) ans+=n; } else { ans+=command_2; if(ans>=n) ans-=n; } i++; }
|
问题在于没有考虑越界问题
。
生命在于折腾