Problem 101 The Blocks Problem UVA gives runtime-error on submission. works fine on Visual Studio Code

70 Views Asked by At

I have been trying to solve the UVA 101 The Blocks Problem. I wrote the solution in C++ and ran the sample input. It gives the correct output on visual studio code but on submitting on UVA it gives runtime error. Any advice to solve this would be highly appreciated.

Here's my code

#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;


void returnAllPos(int x, vector<vector<int>> &blocks){
    while(blocks[x].back() != x){
         int idx = blocks[x].back();
         blocks[x].pop_back();
         if(blocks[idx].size() == 0){
            blocks[idx].push_back(idx);
         }
         else{
            returnAllPos(idx, blocks);
         }
    }
}

void outputBlocks(vector<vector<int>> &blocks){
    for(int i = 0; i < blocks.size(); i++){
        cout << i << ":";
        for(int j = 0; j < blocks[i].size(); j++){
            cout << " " << blocks[i][j];
        }
        cout << '\n';
    }
}

void onto(int a, int b, vector<vector<int>> &blocks){
    returnAllPos(a, blocks);
    returnAllPos(b, blocks);
    blocks[b].push_back(a);
    blocks[a].pop_back();
}

void over(int a, int b, vector<vector<int>> &blocks){
    returnAllPos(a, blocks);
    // find B and put a on top
    for(int i = 0; i < blocks.size(); i++){
        if(find(blocks[i].begin(), blocks[i].end(), b) != blocks[i].end()){
            blocks[i].push_back(blocks[a].back());
            blocks[a].pop_back();
        }
        
    }
}

bool samestack(int a, int b, vector<vector<int>> &blocks){
    for(int i = 0; i < blocks.size(); i++){
        if(find(blocks[i].begin(), blocks[i].end(), b) != blocks[i].end() && find(blocks[i].begin(), blocks[i].end(), a) != blocks[i].end()){
            return true;
        }
    }
    return false;
}

void pileover(int a, int b, vector<vector<int>> &blocks){
    for(int i = 0; i < blocks.size(); i++){
        for(int j = 0; j < blocks[i].size(); j++){
            if(blocks[i][j] == a){
                int end = blocks[i].back();
                std::reverse((blocks[i].begin() + j), blocks[i].end());
                while(1){
                    int elem = blocks[i].back();
                    blocks[i].pop_back();
                    blocks[b].push_back(elem);
                    if(elem == end) return;
                }
            }
        }
    }    
}

void pileonto(int a, int b, vector<vector<int>> &blocks){
    returnAllPos(b, blocks);
    pileover(a, b, blocks);    
}

int main(void){
    int size = 0;

    cin >> size; // read the first line
    if(size < 1 || size > 25) return 1;
    vector<vector<int>> blocks(size);
    for(int i = 0; i < size; i++){
        blocks[i].push_back(i);
    }

    //outputBlocks(blocks);

    std::string first, second;
    
    int a, b;
    while(1){
        cin >> first;
        if(first == "quit") break;
        cin >> a >> second >> b;
        if(samestack(a, b, blocks) || a == b) 
            continue;
        if((a >= 0 && b >= 0) && (a < size && b < size)){
            if(first == "pile"){
                if(second == "onto"){
                    pileonto(a, b, blocks);
                }
                else if(second == "over"){
                    pileover(a, b, blocks);
                }
            }
            else if(first == "move"){
                if(second == "over")
                    over(a, b, blocks);
                else if(second == "onto")
                    onto(a, b, blocks);
            }
        }
        //cin.ignore();   
    }
    
    outputBlocks(blocks);


    return 0;
}

I followed every instruction given in the problem description. My code gives run-time error on UVA.

0

There are 0 best solutions below