我一直试图在C ++中尝试编程问题。这是一个问题(查看第13页和第14页):https://www.cs.auckland.ac.nz/~mjd/prog_contest/problems/NZPC2017.pdf
到目前为止,这是我的代码:
#include <iostream>
#include <string>
using namespace std;
//Defining player
class Player
{
public:
string name;
int chair;
};
Player players[15];
//Eliminates a player
void eliminateP(int numPlayers, int rounds[])
{
int e = 0;
for (int i = 0; i < numPlayers; i++)
{
if (players[i].chair == rounds[0])
{
e = i;
break;
}
}
cout << players[e].name << " has been eliminated." << endl;
for (; e < numPlayers-1; e++)
{
players[e] = players[e + 1];
}
}
//Proceed a round
void doRound(int numPlayers, int rounds[])
{
for (int i = 0; i < numPlayers; i++)
{
players[i].chair += rounds[1];
while (players[i].chair > numPlayers)
{
players[i].chair -= numPlayers;
if (players[i].chair <= 0)
{
players[i].chair += numPlayers;
}
}
}
eliminateP(numPlayers, rounds);
}
//Main function
int main()
{
int numPlayers;
cin >> numPlayers;
for (int i = 0; i < numPlayers; i++)
{
cin >> players[i].name;
players[i].chair = i + 1;
}
int numRounds;
cin >> numRounds;
int rounds[15][2];
for (int i = 0; i < numRounds; i++)
{
cin >> rounds[i][0] >> rounds[i][1];
}
for (int i = 0; i < numRounds; i++)
{
doRound(numPlayers, rounds[i]);
numPlayers--;
}
return 0;
}
奇怪的是,此代码适用于样本输入/输出2,但适用于样本输入/输出1.
有人可以给我提示并告诉我代码有什么问题吗?提前谢谢。
答案 0 :(得分:0)
不再检查任何内容,输出可能包含:
void eliminateP(int numPlayers, int rounds[])
{
for (int di = 0; di < numPlayers; ++di) {
cout << players[di].name[0] << " " << players[di].chair << " | ";
}
cout << endl;
您的代码只能生成第一条消息,因此对于任何输入肯定都会失败,甚至输入2都无法正常工作,因为播放器列表必须丢失。
...但这可能不是你要问的。所以我确实添加了调试输出来消除这样的播放器:
A 2 | B 3 | C 4 | D 5 | E 1 |
Bill has been eliminated.
A 2 | C 4 | D 1 | E 1 |
Anne has been eliminated.
C 3 | D 3 | E 3 |
Chen has been eliminated.
D 1 | E 1 |
Di has been eliminated.
并使用示例输入1运行......并且发生了这种情况:
doRound
请注意,在第二次消除之前,如何对椅子进行错误编号(2,4,1,1而不是2,3,4,1)。当您移除播放器而不是椅子时(for
中的奇怪逻辑会稍微修补主席号码以回到所需范围,但方式不正确。)
一个简单的修复可能是在第一个 if (rounds[0] < players[i].chair) --players[i].chair;
循环结束时扩展消除:
for
并且结束第二个break
(在第一个循环中 if (rounds[0] < players[e].chair) --players[e].chair;
之后继续执行数组的剩余部分):
players
...那就是说,我对样式和效率以及整体算法也会有很多评论,所以在写整本书之前我会停在这里。
但是如果你要学习如何使用调试器,你很可能会在第一轮之后通过检查var genre = stations.map(item => item.genre);
const stationsByGenre = genre.map(item => {
if (genreArray.indexOf(item) === -1) {
genreArray.push(item);
//Genre Title - item
stations.filter(station => {
return station.genre === item
}).map(station => {
//Station row
});
}
});
数组找出一些东西不完全正确,让椅子还在包括数字4和5,即使只有4个存在。 (我的这个调试输出是穷人的选择,当我只是把你的代码提供给在线网站,没有调试器......有时,就像在这种情况下,它可能就足够了,如果bug很明显,但一般你应该有调试器可以节省每个人的时间,因此您可以在代码运行时检查内部的任何内容)