954,504 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Runtime error!! ACM problem

This is (supposed to be) a soln for a ACM problem

But the program produces a runtime error.
Can anyone spot the bug?

#include<iostream>
#include<string>

#define MAX 25

using namespace std;

void print_blocks();
int return_initial(int a);//return all the blocks 
						//on top of block a to their initial pos

int track[MAX];//in which stack a block is currently stacked
int blkpos[MAX][MAX];//block stacks
int n;

int main()
{
	//Initialize Start
	cin>>n;
	for(int i = 0; i < n; ++i)
		for(int j = 0; j < n; ++j)
			blkpos[i][j] = -1;
			
	for(int i = 0; i < n; ++i)
		blkpos[i][0] = i;
		
	for(int i = 0; i < n; ++i)
		track[i] = i;
	//Initialize End
	
	string command;
	int a,b;
	while(cin>>command)			
	{
		
		if(command == "quit")
			break;
			
		if(command == "move")
		{
			
			cin>>a>>command>>b;
						
			if(track[a] == track[b])//Illegal command
				continue;
			if(command == "onto")//command == move a onto b
			{
				int pos = return_initial(a);
				blkpos[track[b]][ return_initial(b) + 1] = a;
				blkpos[track[a]][pos] = -1;
				track[a] = track[b];				
				
			}
			else//command == move a over b
			{
				
				int pos = return_initial(a);
				int i;
				for( i = 0; blkpos[track[b]][i] != -1; ++i)
					;
				blkpos[track[b]][i] = a;
				blkpos[track[a]][pos] = -1;
				track[a] = track[b];				
			}
		}
		else //command == pile
		{
			cin>>a>>command>>b;
			if(track[a] == track[b])
				continue;
			if(command == "onto") // command == pile a onto b
			{
				int pos = return_initial(b);
				int i;
				for( i = 0; blkpos[track[a]][i] != a; ++i)
					;
				int from = track[a];
				for( ; blkpos[from][i] != -1; ++i)
				{
					blkpos[track[b]][++pos] = blkpos[from][i];
					track[blkpos[from][i]] = track[b];
					blkpos[from][i] = -1;					
				}
			}
			else //command == pile a over b
			{
				int pos;
				int i;
				for(i = 0; blkpos[track[b]][i] != b; ++i)
					;
				pos = i;				
				for( i = 0; blkpos[track[a]][i] != a; ++i)
					;
				int from = track[a];
				for( ; blkpos[from][i] != -1; ++i)
				{
					blkpos[track[b]][++pos] = blkpos[from][i];
					track[blkpos[from][i]] = track[b];
					blkpos[from][i] = -1;					
				}
			}			
			
		}
		
			
	}
	
	print_blocks();
}


int return_initial(int a)
{
	
	int i;
	for(i = 0; blkpos[ track[a]][i] != a; ++i )
		;
	int temp;
	int pos = i;
		
	for(++i ; (temp = blkpos[ track[a]][i]) != -1; ++i )
	{
		blkpos[ track[a]][i] = -1;
		int j;
		for( j = 0; blkpos[temp][j] != -1; ++j)
			;
		blkpos[temp][j] = temp;
		track[temp] = temp;		
		
	}
	return pos;
	
}


void print_blocks()
{
	
	for(int i = 0; i < n; ++i)
	{
			cout<<i<<":";
			for(int j = 0; blkpos[i][j] != -1; ++j)
			{
				cout<<" "<<blkpos[i][j];
			}
			cout<<"\n";
	}
}
Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 

Have you tried running it in a debugger?
If you do a stack dump (backtrace)
it will show exactly where it bombed.

jim mcnamara
Junior Poster
180 posts since May 2004
Reputation Points: 62
Solved Threads: 10
 

I havent used a debugger, but I think it produces runtime error depending on the input. For some input the online judge uses it produces the error, not for the input i gave to it.

Asif_NSU
Posting Whiz
353 posts since Apr 2004
Reputation Points: 113
Solved Threads: 3
 

Hi Asif, I don't know if you still need this, but I think the cause of runtime error is the size of MAX. What if the given input for 'n' is greater than 25??? Then you'll get a Run-time Error. (but i'm not sure, obviously if it is mentioned in problem that the input will be less than 25 than this is NOT the cause of the problem)

blackcloudbd
Newbie Poster
17 posts since May 2009
Reputation Points: 10
Solved Threads: 0
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You