USACO珠子,无法在循环时调试

USACO-beads, unable to debug while loops

本文关键字:循环 调试 珠子 USACO      更新时间:2023-10-16

这是我正在处理的问题

我没有收到任何编译时错误,运行时错误,并且我的大多数代码似乎都可以正常工作。调试后,我发现left()right()内的while循环导致了问题。我很难弄清楚为什么,所以任何帮助都会很棒。谢谢。

以防万一——

示例输入:

29

wwwbbrwrbrwrwrwwrbwrwrrb

示例输出:

11

法典:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000000 + 10;
int n;
char cur_beads[MAXN];
//WORKS LIKE A BOSS:
void final_array(int int_in, char * array_in){
for (int i = 1; i <= int_in; i++){
cur_beads[n-i] = array_in[int_in - i];
}
for (int i = 0; i < n - int_in; i++){
cur_beads[i] = array_in[int_in+i];
}
//    cout << "new array, for "<< int_in << " = " <<cur_beads << endl << endl;;
}
//ERROR HERE:
int left(){ //function
int left_a = 0, left_b = 0, c = 0;
cout << cur_beads << endl;
while((cur_beads[c] != 'b' || cur_beads[c] != 'w') &&  c <= n){
cout << cur_beads[c] << endl;
c++;
}
cout << "c = " << c << endl;
while((cur_beads[c] == 'b' || cur_beads[c] == 'w')){
left_b++;
c++;
}
cout << "left_b = " << left_b << endl;
c = 0;
while((cur_beads[c] != 'r' || cur_beads[c] != 'w') &&  c <= n){
c++;
}
cout << "c = " << c << endl;
while(cur_beads[c] == 'r' || cur_beads[c] == 'w'){
left_a++;
c++;
}
cout << "left_a = " << left_a << endl;
if (left_a > left_b){
return left_a;
cout << "left = " << left_a << endl;
}
else{
return left_b;
cout << "left = " << left_b << endl;
}
}
//ERROR HERE:
int right(){ //function
int right_a = 0, right_b = 0, c = 0;
while((cur_beads[n-c] != 'b' || cur_beads[n-c] != 'w') &&  c <= n){
c++;
}
while((cur_beads[n-c] == 'b' || cur_beads[n-c] == 'w')){
right_b++;
c++;
}
c = 0;
while((cur_beads[n-c] != 'a' || cur_beads[n-c] != 'w') &&  c <= n){
c++;
}
while((cur_beads[n-c] == '' || cur_beads[n-c] == 'w')){
right_a++;
c++;
}
if (right_a > right_b){
return right_a;
cout << "right = " << right_a << endl;
}
else{
return right_b;
cout << "right = " << right_b << endl;
}
}
int main(){
int ans = 0, current_ans = 0; //stored as 0 by default
ifstream fin("beads.in");
ofstream fout("beads.out");
fin >> n;
char beads[MAXN];

for(int i = 0; i < n; i++){
fin >> beads[i];
}
//    final_array(11, beads);
//    current_ans = left();
//    cout << "current_ans = " << current_ans << endl;

for(int i = 1; i < n; i++){ //main loop
final_array(i, beads);
current_ans = left() + right();
cout << "current_ans = " << current_ans << endl;
if (current_ans > ans){
ans = current_ans;
}
}
fout << ans << endl;
}

left()中的所有 cout 都是用于调试代码的。

while((cur_beads[c] != 'b' || cur_beads[c] != 'w') &&  c <= n)

没有意义,因为任何字符都不会同时是"b"和"w"。更有意义的是将此行(以及其他有此问题的行(修改为

while((cur_beads[c] != 'b' && cur_beads[c] != 'w') &&  c <= n)