| SaswatPadhi |
11Sep2009 11:56 |
Re: robot simulation
Hi.
Welcome to G4EF :)
First of all, your program had a bug due to which it didn't find the correct paths.
You were passing x,y into find_path; but were working with the pair y,x. So, the abscissa and ordinates just got reversed.
See this sample run :
Code:
The row and column of the starting point is (2,6)
The row and column of the destination is (14,13)
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . R . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . X . .
. . . . . . . . . . . . . . . .
Run the maze area with or without block:
1.Without block
2.With block
Enter your selection <1><2>1
MAZE:
. . + + + + + + + + + + + + + +
. . + . . . . . . . . . . + + +
. . + . . . R . . . . . . + + +
. . + . . . . . . . . . . + + +
. . + . . . . . . . . . . + + +
. . + . . . . . . . . . . + + +
. . + . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . X + +
. . . . . . . . . . . . . . + +
Total non visited steps191
Success!
Total Steps63
See that, although it should start from (2,6), it started from (6,2).
Anyway, I corrected the code for you, and here it is :
Code: CPP
#include <iostream> #include <conio.h> #include <iomanip> #include <vector> #define FALSE 0 #define TRUE 1
using namespace std; static int steps; int n,colsend,rowend,column,row,blockrow,blockcol,;
// Symbols: // '.' = open // '#' = blocked // 'R' = robot // 'X' = goal // '+' = path
void displaymaze(vector<vector<char> >); void display(vector<vector<char> >); int find_path(int x, int y,vector<vector<char> >);
int main() { int choice,numsquare,numblock; int limit = 1; int nonvisit = 0;
cout <<"Set the value of n x n squares area:"<<endl; cout <<"Enter the value for n:"; cin >> n; vector<vector<char> > square(n,vector<char>(n,'.'));
display(square); cout<<"\nThis is the square area robot could move."<<endl; cout <<"\nNow specific the robot starting point and destination to move:"<<endl;
cout <<"Enter which row to start(starting from 0) :"; do { cin >> row; if (row > (n-1) || row<0) cout<<"The row size is not in range,please enter again:"; } while (row > (n-1) || row<0); cout <<"Enter which column to start(starting from 0) :"; do { cin >> column; if (column > (n-1) || column <0) cout<<"The column size is not in range,please enter again:"; } while (column > (n-1) || column <0);
cout <<"Enter which row to end(starting from 0) :"; do { cin >> rowend; if (rowend > (n-1)||rowend <0) cout<<"The column size is not in range,please enter again:"; } while (rowend >(n-1)||rowend <0); cout <<"Enter which column to end(starting from 0) :"; do { cin >> colsend; if (colsend > (n-1)||colsend <0) cout<<"The column size is not in range,please enter again:"; } while (colsend > (n-1)||colsend <0); system("cls");
cout<<"The row and column of the starting point is ("<<row<<","<<column<<")"<<endl; cout<<"The row and column of the destination is ("<<rowend<<","<<colsend<<")"<<endl; square[row][column]='R'; square[rowend][colsend]='X'; display(square); cout <<"Run the maze area with or without block:"<<endl; cout <<"1.Without block"<<endl; cout <<"2.With block"<<endl; cout <<"Enter your selection <1><2>"; cin >> choice;
if (choice ==1) { system("cls");
if ( find_path(column, row,square) == TRUE ) { cout<<"Success!\n"; } else cout<<"Failed\n";
cout<<"Total Steps = "<<steps;
}
if (choice ==2) { system("cls"); cout <<"How many block to be insert:"<<endl; cout <<"1.One"<<endl; cout <<"2.More than one"<<endl; cout <<"Enter your selection <1>/2>"; cin >>numsquare; if (numsquare==1) { cout <<"Which position to insert the block:"<<endl; cout <<"Block row:"; cin >> blockrow; cout <<"Block column:"; cin >> blockcol; square[blockrow][blockcol]='#'; if ( find_path(column, row,square) == TRUE ) { cout<<"Success!\n"; } else cout<<"Failed\n";
cout<<"Total Steps = "<<steps; } if (numsquare==2) { cout <<"How many block to be insert:"<<endl; cin >> numblock; while (limit<=numblock) { cout <<"Which position to insert the block "<<limit<<":"<<endl; cout <<"Block row:"; cin >> blockrow; cout <<"Block column:"; cin >> blockcol; square[blockrow][blockcol]='#'; limit++; }
if ( find_path(column, row,square) == TRUE ) { cout<<"\nSuccess!\n"; } else cout<<"Failed\n";
cout<<"Total Steps = "<<steps<<endl; }
}
getch(); return 0; } // main()
void displaymaze(vector<vector<char> >maze) { cout<<"MAZE:\n";
for (int a=0;a<n;a++) { cout<<setw(7); for (int b=0;b<n;b++) { cout<<maze[a][b]; cout<<setw(3); } cout<<endl; }
return; }
void display(vector<vector<char> >square) { for (int x=0;x<n;x++) { cout<<setw(7); for (int y=0;y<n;y++) { cout << square[x][y]; cout<<setw(3); } cout<<endl; } }
int find_path(int x, int y,vector<vector<char> >square) { int nonvisit = 0; // If x,y is outside maze, return false. if ( x < 0 || x > n - 1 || y < 0 || y > n - 1 ) return FALSE; // If x,y is the goal, return true.
if ( square[y][x] == 'X') { displaymaze(square); for (int e=0;e<n;e++) { for (int f=0;f<n;f++) { if (square[e][f]=='.') { nonvisit+=1; }
} } cout<<"Total non visited steps = "<<nonvisit<<endl; return TRUE; }
// If x,y is not open, return false. if ( square[y][x] != '.' && square[y][x] != 'R' ) return FALSE;
// Mark x,y part of solution path. if ( square[y][x] == '.' )square[y][x] = '+'; steps++;
// If find_path North of x,y is true, return true. if ( find_path(x, y - 1,square) == TRUE ) return TRUE;
// If find_path East of x,y is true, return true. if ( find_path(x + 1, y,square) == TRUE ) return TRUE;
// If find_path South of x,y is true, return true. if ( find_path(x, y + 1,square) == TRUE ) return TRUE;
// If find_path West of x,y is true, return true. if ( find_path(x - 1, y,square) == TRUE ) return TRUE;
//mark the repeat steps square[y][x]='X'; return FALSE; }
And here is the same sample run with the modified code :
Code:
The row and column of the starting point is (2,6)
The row and column of the destination is (14,13)
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . R . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . X . .
. . . . . . . . . . . . . . . .
Run the maze area with or without block:
1.Without block
2.With block
Enter your selection <1><2>1
MAZE:
. . . . . . + + + + + + + + + +
. . . . . . + . . . . . . + + +
. . . . . . R . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . + + +
. . . . . . . . . . . . . X + +
. . . . . . . . . . . . . . + +
Total non visited steps = 200
Success!
Total Steps = 55
About the question you asked, I will think about it and tell you soon.
|