2017-09-22 88 views
-3

我一直在尝试用C++来编程的问题。这是个问题(看第13页和第14):https://www.cs.auckland.ac.nz/~mjd/prog_contest/problems/NZPC2017.pdfC++音乐会

这是我到目前为止的代码:

#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

不检查任何东西越多,输出可能包含:

<name> has been eliminated. 
<name> has won. 
Players left are <name list>. 

您的代码能够只生产了第一条消息,所以它肯定会失败对于任何输入,甚至没有输入2能正常工作,如球员名单必须丢失。

...但这可能不是你所问的。所以,我没有添加调试输出为消除玩家是这样的:

void eliminateP(int numPlayers, int rounds[]) 
{ 
    for (int di = 0; di < numPlayers; ++di) { 
     cout << players[di].name[0] << " " << players[di].chair << " | "; 
    } 
    cout << endl; 

和所使用的样本输入1运行...这发生了:

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. 

如何通知之前已经第二消除椅子错误编号(2,4,1,1而不是2,3,4,1)。当你删除玩家,但不是椅子(并且你的奇怪逻辑doRound会稍微修补椅子号码以回到期望的范围,但以不正确的方式)。

一个简单的解决可以是延长的消除,在第一for环的末端:

 if (rounds[0] < players[i].chair) --players[i].chair; 

And和第二for端(进行阵列的其余部分发生在第一环路之后break):

 if (rounds[0] < players[e].chair) --players[e].chair; 

...这么说,我也有关于风格和效率,以及整个算法也有很多意见,所以我会停止,而在这里,写整本书之前。

但是如果你将学习如何使用调试器,你就极有可能通过检查第一轮后players阵列,这东西是不完全正确,有椅子仍然包括数字4和5,即使查出其中只有4个存在。 (这是我的调试输出是穷人的选择,当我只是将您的代码喂给在线网站时,没有调试器......有时候,就像在这种情况下,这可能就足够了,如果这个bug很明显,但通常你应该有调试器来节省每个人的时间,所以当你的代码运行时你可以检查任何东西)

+0

感谢您的回复。我的代码现在似乎工作。 – ianc1339