Any command in which a = b or in which a and b are in the same stack of blocks is an illegal command. All illegal commands should be ignored and should have no affect on the configuration of blocks.
Looks like you didn't completely take care of that in your code, or did I miss anything ... ???
-turuthok-
The fear of the LORD is the beginning of knowledge (Proverbs 1:7).
if(object1 != object2)// if they aren't the same block
{
l = find_ls(object1,object2,bl,bq);// get position of blocks
if(!l.same)// if the aren't in the same stack
{
if(ins == 1) // move
{
if(object1 > 0 && object2 > 0) //ignore if either block number is less than 1
{
if(object1 < bq && object2 < bq)// ignore if either block number is not less that number of blocks
{
if(instruction2[1] == 'n') // onto
moveonto(l,bl,bq);
else
moveover(l,bl,bq);
}
}
yeah, evanmars RE didn't mean your solution wrong. Because before I solve this problem My solution get more true I/O, and that means my solution works fine to me too, but I got SIGSEGV. And I check my array and get AC.
Here's an input that breaks your program in two ways:
10
move 9 onto 1
move 8 over 1
move 7 over 1
move 6 over 1
pile 8 over 6
pile 8 over 5
move 2 over 1
move 4 over 9
move 9 over 9
move 1 over 9
move 0 over 5
move 0 ontopof 6
relocate 6 before 3
quit
void Set(const short n);
void MoveOnto(const short a, const short b);
void MoveOver(const short a, const short b);
void PileOnto(const short a, const short b);
void PileOver(const short a, const short b);
short NumBlocks();
void WriteWorld() const;
};
void Blocks::init_blockWorld (){
short init = 0;
blockWorld.resize(n_blocks);
for (unsigned int i = 0; i < blockWorld.size(); i++){
blockWorld.resize(n_blocks);
blockWorld[0] = init++;
for (unsigned int j = 1; j < blockWorld.size(); j++)
blockWorld[j] = -1;
}
}
Index Blocks::FindBlock (const short block){
Index fix;
for (unsigned int i = 0; i < blockWorld.size (); i++)
for (unsigned j = 0; j < blockWorld.size(); j++){
if (blockWorld[j] == block){
fix.Set(i,j);
break;
}
}
return fix;
}
void Blocks::ReturnToInitialPosition(const Index& fix){
short block;
for (unsigned int i = fix.Y(); i < blockWorld.size(); i++){
if (blockWorld[fix.X()] == -1) break;
else{
block = blockWorld[fix.X()];
blockWorld[fix.X()] = -1;
for (unsigned int j = 0; j < blockWorld[block].size(); j++)
if (blockWorld[block][j] == -1) {
blockWorld[block][j] = block;
break;
}
}
}
}
void Blocks::Set(const short n){
n_blocks = n;
init_blockWorld ();
}
void Blocks::MoveOnto(const short a, const short b){
Index fixA(FindBlock(a));
Index fixB(FindBlock(b));
Index Temp;
unsigned int index=1;
if ((fixA.X() == fixB.X()) || (a==b)) return;
while ((blockWorld[fixA.X()][fixA.Y()+index] != -1)) {
Temp.Set(fixA.X(),fixA.Y()+index);
ReturnToInitialPosition(Temp);
index++;
}
index = 1;
while ((blockWorld[fixB.X()][fixB.Y()+index] != -1)){
Temp.Set(fixB.X(),fixB.Y()+index);
ReturnToInitialPosition(Temp);
index++;
}
index = 1;
for (unsigned int i = 0; i < SavePile.size(); i++){
for (unsigned int j = 0; j < blockWorld[SavePile[i]].size(); j++)
if (blockWorld[SavePile[i]][j] == -1) {
blockWorld[SavePile[i]][j] = SavePile[i];
break;
}
}
}
void Blocks::PileOver(const short a, const short b){
Index fixA(FindBlock(a));
Index fixB(FindBlock(b));
Index OverB;
unsigned int index = 0;
if ((fixA.X() == fixB.X()) || (a==b)) return;
for(unsigned int i = fixB.Y()+1; i < blockWorld[fixB.X()].size(); i++){
if (blockWorld[fixB.X()][i]==-1){
OverB.Set(fixB.X(),i);
break;
}
}
index = 0;
for (unsigned int i = OverB.Y(); i < blockWorld[OverB.X()].size(); i++){
if (blockWorld[fixA.X()][fixA.Y()+index] == -1) break;
else{
blockWorld[OverB.X()][OverB.Y()+index] = blockWorld[fixA.X()][fixA.Y()+index];
blockWorld[fixA.X()][fixA.Y()+index] = -1;
index++;
}
}
}
short Blocks::NumBlocks (){
return n_blocks;
}
void Blocks::WriteWorld() const{
for(unsigned int i=0; i < blockWorld.size(); i++){
cout << i << ": ";
for(unsigned int j = 0; j < blockWorld[i].size(); j++){
if (blockWorld[i][j] == -1) break;
cout << blockWorld[i][j] << " ";
}
cout << endl;
}
}
int main(){
string cmd1;
string cmd2;
short a;
short b;
short n;
string line;
Blocks blockWorld;
cin >> n;
if ((n>0)&&(n<25)){
blockWorld.Set(n);
while ((cin >> cmd1) && (cmd1 != "quit")){
cin >> a >> cmd2 >> b;
if ((a>=0)&&(b>=0) && (a < blockWorld.NumBlocks()) && (b < blockWorld.NumBlocks())){
if ((cmd1 == "move") && (cmd2 == "onto"))
blockWorld.MoveOnto(a,b);
else if ((cmd1 == "move") && (cmd2 == "over"))
blockWorld.MoveOver(a,b);
else if ((cmd1 == "pile") && (cmd2 == "onto"))
blockWorld.PileOnto(a,b);
else if ((cmd1 == "pile") && (cmd2 == "over"))
blockWorld.PileOver(a,b);
}
}
blockWorld.WriteWorld();
}
}
[/cpp]
void Set(const short n);
void MoveOnto(const short a, const short b);
void MoveOver(const short a, const short b);
void PileOnto(const short a, const short b);
void PileOver(const short a, const short b);
short NumBlocks();
void WriteWorld() const;
};
void Blocks::init_blockWorld (){
short init = 0;
blockWorld.resize(n_blocks);
for (unsigned int i = 0; i < blockWorld.size(); i++){
blockWorld.resize(n_blocks);
blockWorld[0] = init++;
for (unsigned int j = 1; j < blockWorld.size(); j++)
blockWorld[j] = -1;
}
}
Index Blocks::FindBlock (const short block){
Index fix;
for (unsigned int i = 0; i < blockWorld.size (); i++)
for (unsigned j = 0; j < blockWorld.size(); j++){
if (blockWorld[j] == block){
fix.Set(i,j);
break;
}
}
return fix;
}
void Blocks::ReturnToInitialPosition(const Index& fix){
short block;
for (unsigned int i = fix.Y()+1; i < blockWorld.size(); i++){
if (blockWorld[fix.X()] == -1) break;
else{
block = blockWorld[fix.X()];
blockWorld[fix.X()] = -1;
for (unsigned int j = 0; j < blockWorld[block].size(); j++)
if (blockWorld[block][j] == -1) {
blockWorld[block][j] = block;
break;
}
}
}
}
void Blocks::Set(const short n){
n_blocks = n;
init_blockWorld ();
}
void Blocks::MoveOnto(const short a, const short b){
Index fixA(FindBlock(a));
Index fixB(FindBlock(b));
index = 1;
for (unsigned int i = 0; i < SavePile.size(); i++){
for (unsigned int j = 0; j < blockWorld[SavePile[i]].size(); j++)
if (blockWorld[SavePile[i]][j] == -1) {
blockWorld[SavePile[i]][j] = SavePile[i];
break;
}
}
}
void Blocks::PileOver(const short a, const short b){
Index fixA(FindBlock(a));
Index fixB(FindBlock(b));
Index OverB;
unsigned int index = 0;
if ((fixA.X() == fixB.X()) || (a==b)) return;
for(unsigned int i = fixB.Y()+1; i < blockWorld[fixB.X()].size(); i++){
if (blockWorld[fixB.X()][i]==-1){
OverB.Set(fixB.X(),i);
break;
}
}
index = 0;
for (unsigned int i = OverB.Y(); i < blockWorld[OverB.X()].size(); i++){
blockWorld[OverB.X()][OverB.Y()+index] = blockWorld[fixA.X()][fixA.Y()+index];
blockWorld[fixA.X()][fixA.Y()+index] = -1;
index++;
}
}
short Blocks::NumBlocks (){
return n_blocks;
}
void Blocks::WriteWorld() const{
for(unsigned int i=0; i < blockWorld.size(); i++){
cout << i << ": ";
for(unsigned int j = 0; j < blockWorld[i].size(); j++){
if (blockWorld[i][j] == -1) break;
cout << blockWorld[i][j] << " ";
}
cout << endl;
}
}
int main(){
string cmd1;
string cmd2;
short a;
short b;
short n;
string line;
Blocks blockWorld;
cin >> n;
if ((n>0)&&(n<25)){
blockWorld.Set(n);
while ((cin >> cmd1) && (cmd1 != "quit")){
cin >> a >> cmd2 >> b;
if ((a>=0)&&(b>=0) && (a < blockWorld.NumBlocks()) && (b < blockWorld.NumBlocks())){
if ((cmd1 == "move") && (cmd2 == "onto"))
blockWorld.MoveOnto(a,b);
else if ((cmd1 == "move") && (cmd2 == "over"))
blockWorld.MoveOver(a,b);
else if ((cmd1 == "pile") && (cmd2 == "onto"))
blockWorld.PileOnto(a,b);
else if ((cmd1 == "pile") && (cmd2 == "over"))
blockWorld.PileOver(a,b);
}
}
blockWorld.WriteWorld();
}
}
[/cpp]
void Set(const short n);
void MoveOnto(const short a, const short b);
void MoveOver(const short a, const short b);
void PileOnto(const short a, const short b);
void PileOver(const short a, const short b);
short NumBlocks();
void WriteWorld() const;
};
void Blocks::init_blockWorld (){
short init = 0;
blockWorld.resize(n_blocks);
for (unsigned int i = 0; i < blockWorld.size(); i++){
blockWorld.resize(n_blocks);
blockWorld[0] = init++;
for (unsigned int j = 1; j < blockWorld.size(); j++)
blockWorld[j] = -1;
}
}
Index Blocks::FindBlock (const short block){
Index fix;
for (unsigned int i = 0; i < blockWorld.size (); i++)
for (unsigned j = 0; j < blockWorld.size(); j++){
if (blockWorld[j] == block){
fix.Set(i,j);
break;
}
}
return fix;
}
void Blocks::ReturnToInitialPosition(const Index& fix){
short block;
for (unsigned int i = fix.Y()+1; i < blockWorld.size(); i++){
if (blockWorld[fix.X()] == -1) break;
else{
block = blockWorld[fix.X()];
blockWorld[fix.X()] = -1;
for (unsigned int j = 0; j < blockWorld[block].size(); j++)
if (blockWorld[block][j] == -1) {
blockWorld[block][j] = block;
break;
}
}
}
}
void Blocks::Set(const short n){
n_blocks = n;
init_blockWorld ();
}
void Blocks::MoveOnto(const short a, const short b){
Index fixA(FindBlock(a));
Index fixB(FindBlock(b));
for (unsigned int i = fixB.Y()+1; i < blockWorld[fixB.X()].size(); i++)
if (blockWorld[fixB.X()] == -1){
blockWorld[fixB.X()][i] = a;
break;
}
}
void Blocks::PileOnto(const short a, const short b){
Index fixA(FindBlock(a));
Index fixB(FindBlock(b));
unsigned int index=1;
if ((fixA.X() == fixB.X()) || (a==b)) return;
ReturnToInitialPosition(fixB);
for (unsigned int i = fixA.Y(); i < blockWorld[fixA.X()].size();i++){
if (blockWorld[fixA.X()][i]==-1) break;
else{
blockWorld[fixB.X()][fixB.Y()+index]= blockWorld[fixA.X()][i];
blockWorld[fixA.X()][i]=-1;
index++;
}
}
}
void Blocks::PileOver(const short a, const short b){
Index fixA(FindBlock(a));
Index fixB(FindBlock(b));
short TopOfStack=0;
unsigned int index = 0;
if ((fixA.X() == fixB.X()) || (a==b)) return;
for(unsigned int i = fixB.Y()+1; i < blockWorld[fixB.X()].size(); i++)
if (blockWorld[fixB.X()][i]==-1){
TopOfStack = i;
break;
}
index = 0;
for (unsigned int i = TopOfStack; i < blockWorld[fixB.X()].size(); i++){
if (blockWorld[fixA.X()][fixA.Y()+index] == -1) break;
else{
blockWorld[fixB.X()][i] = blockWorld[fixA.X()][fixA.Y()+index];
blockWorld[fixA.X()][fixA.Y()+index] = -1;
index++;
}
}
}
short Blocks::NumBlocks (){
return n_blocks;
}
void Blocks::WriteWorld() const{
for(unsigned int i=0; i < blockWorld.size(); i++){
cout << i << ": ";
for(unsigned int j = 0; j < blockWorld[i].size(); j++){
if (blockWorld[i][j] == -1) break;
cout << blockWorld[i][j] << " ";
}
cout << endl;
}
}
int main(){
string cmd1;
string cmd2;
short a;
short b;
short n;
string line;
Blocks blockWorld;
cin >> n;
if ((n>0)&&(n<25)){
blockWorld.Set(n);
while ((cin >> cmd1) && (cmd1 != "quit")){
cin >> a >> cmd2 >> b;
if ((a>=0)&&(b>=0) && (a < blockWorld.NumBlocks()) && (b < blockWorld.NumBlocks())){
if ((cmd1 == "move") && (cmd2 == "onto")) blockWorld.MoveOnto(a,b);
else if ((cmd1 == "move") && (cmd2 == "over")) blockWorld.MoveOver(a,b);
else if ((cmd1 == "pile") && (cmd2 == "onto")) blockWorld.PileOnto(a,b);
else if ((cmd1 == "pile") && (cmd2 == "over")) blockWorld.PileOver(a,b);
}
}
blockWorld.WriteWorld();
}
}
[/cpp]
Your first code is too long to read it for me but I had the similar error in my solution. I wrote then a program that generated a long, random inputs and I were running my program with those inputs. In this way I found the input that my program didn't solve (it gave a runtime error). If someone will have similar error in the future, he can do it too. Good luck!