8. struct Point
{
int x;
int y;
Point (){x = NULL;y = NULL;}
Point (int x1, int y1){x = x1;y = y1;}
~Point (void){}
Point & operator= (const Point &p)
{x = p.x;y = p.y;return (*this);}
bool operator== (const Point &p)
{return ( (x == p.x) && (y == p.y) );}
bool operator!= (const Point &p)
{return ( (x != p.x) || (y != p.y) );}
// 2 points are 'connected' but 'different' if they :
// i) share the same 'x' but adjacent 'y' values, OR
// ii) share the same 'y' but adjacent 'x' values!!
9. bool isConnected (Point &p)
{
return (((x == p.x) && ( ((y-1) == p.y) || ((y+1) == p.y) )) ||
((y == p.y) && ( ((x-1) == p.x) || ((x+1) == p.x) ))
);
}
void display (std::ostream &outputStream=std::cout)
{outputStream << "[" << x << ", " << y << "]";}
};
// ------------------------------------------------------------------------
------------
// type define a vector of Point structs ...
typedef std::vector<Point> VectorOfPointStructType;
// type define a vector of VectorOfPointStructType ...
typedef std::vector<VectorOfPointStructType>
VectorOfVectorOfPointStructType;
// ------------------------------------------------------------------------
------------
10. static std::string IntToString (const int intValue)
{
std::ostringstream oss (std::ostringstream::out);
oss << intValue;
return ( oss.str() );
}// end intToString () ...
// ------------------------------------------------------------------------
------------
static int GenerateRandomInteger (const int lowerLimit, const
int upperLimit)
{
time_t secs;
time (&secs);
std::srand ( (unsigned int) secs );
return ( std::rand () % (upperLimit - lowerLimit + 1) +
lowerLimit );
}// end GenerateRandomInteger () ...
// ------------------------------------------------------------------------
------------
11. #endif // Assignm3_UTILS_H
Files/CSCI212_Assignmt3.doc
University of Wollongong
School of Computing and Information Technology
CSCI212 Interacting Systems
Assignment 3
Aim
The objective of this assignment is to apply the concepts of
threading by developing a simple C++ Pthreads program to
discover the surroundings and the shortest path in a 2D maze
Background
This assignment requires you to write a multi-threaded C/C++
“Pathfinder” program to discover the surroundings of a jungle
maze. Each [x, y] location in the maze represents a ‘grid area’
of the jungle terrain. A particular gird area could be :
· “impassable”
12. (rep. by ‘#’ barrier) ,
· contains danger
(rep. by ‘X’ danger area)
· clear,
(i.e. allows you to travel)
An example of the jungle maze will be provided to you (see
Appendix A, ‘mazedata.txt’).
Your objective is to explore as much of the jungle maze terrain
as possible, and mark the discovered area as barrier (‘#’), or
danger (‘X’) accordingly.
When your program terminate, it should output a map of the
explored jungle maze, as well as 1 ‘safe’ path, to traverse from
Start to End locations.
Task Requirements
A) At startup, your program should read in the 2D maze
configuration (“mazedata.txt”) which stores the information
about the maze dimensions, barriers, start and end locations.
Please refer to Appendix A for an example.
13. B) For the purposes of testing your program, a sample of what
information should be output is shown in Appendix B.
C) Before you start developing your program, you should take
some time to review the output, and analyze the requirements of
the Pathfinder program.
D) Your program should have at least 2 threads, each thread
attempting to explore surrounding locations to discover whether
it contains a barrier (‘#’) or danger (‘X’).
E) Impt 1 : your program should maintain a global Maze
resource or variable, holding information about all the barriers
or danger areas uncovered by your exploring threads!
F) Impt 2 : when a particular thread has encountered a barrier
(‘#’) or danger (‘X’), it should …
· Record the path (history of point locations) it has traversed,
since the Start Location, to reach the barrier / danger areas, and
locations of barrier / danger should be marked on your ‘global
Maze resource’
· The thread ‘loses its life’ (i.e. should be destroyed) if it has
encountered a danger area (‘X’) !!
G) Whenever a thread is destroyed, your program should create
another replacement thread, to traverse the jungle maze
beginning from the Start Location again. But this time, it should
14. access the ‘global Maze resource’ to learn and avoid the
barriers and danger areas discovered by its predecessor threads!
H) In this way, the ‘sacrifice’ of the destroyed threads are not
in vain, as its knowledge (of locations of the barriers / danger
areas) have been recorded in the ‘global Maze resource’ that can
be accessed by future generations of created threads to aid their
survival in order to discover a path to End Location!
I) As you probably guess by now, the access to the ‘global Maze
resource’ should be protected via usage of mutex locks.
Whether a thread is:
· Updating its discovery of the path to barrier / danger areas
OR
· Accessing the ‘global Maze resource’ to learn about the
discovered locations of the barriers / danger areas
Only 1 thread can access it at any one time!
J) Once the program is completed and tested to be working
successfully, you are highly encouraged to add on “new
features” to the program that you feel are applicable to the task
of finding the shortest path thru a maze. Additional marks may
be awarded subject to the relevancy and correctness of the new
functionalities.
15. K) Your program should be written in C++, and using the
library functions available in header file ‘pthread.h’, to handle
all aspects of thread creation, management and synchronization.
L) To encourage good program design, you should consider
using different *.cpp class files to encapsulate groups of related
methods/functions.
Additional Resources
· After all students have gone through this document, your tutor
will hold a special session to discuss / elaborate on the
requirements of this assignment.
· In addition, your tutor will hold a Q & A sessions to clarify
any issues/doubts you may have on the analysis and design of
this multi-threaded program. To ensure a fruitful session, all
students must come prepared with their list of questions, so that
everybody’s time is efficiently utilized.
Deliverables
1) The deliverables include the following:
a) The actual working shell program (hard+soft copies), with
comments on each file, function or block of code to help the
tutor understand its purpose.
b) A word document (hard+soft copies) that elaborates on:
16. · (Interpreted) requirements of the program
· Diagram / Illustrations of program design
· Summary of implementation of each module in your program
· Reflections on program development (e.g. assumptions made,
difficulties faced, what could have been done better, possible
enhancements in future, what have you learnt, etc)
c) A program demo/evaluation during lab session. You must be
prepared to perform certain tasks / answer any questions posed
by the tutor.
2) IMPT: Please follow closely, to the submission instructions
in Appendix C, which contains details about what to submit, file
naming conventions, when to submit, where to submit, etc.
3) The evaluation will be held during lab session where you are
supposed to submit your assignment. Some time will be
allocated for you to present / demonstrate your program during
the session.
Grading
Student’s deliverable will be graded according to the following
criteria:
(i) Program fulfills all the basic requirements stipulated by the
assignment
17. The requirements includes some/all of the following:
· Ability to handle maze of different sizes
· No. of danger areas uncovered
· No. of barriers uncovered
· No. of threads utilized
· Validity of the single solution path (a series of Point locations
leading from Start to End locations
(ii) Successful demonstration of a working program, clarity of
presentation and satisfactory answers provided during Q & A
session.
(iii) Additional efforts in enhancing the program with features
over and above task requirements, impressive, “killer”
presentation and demonstration, etc.
(iv) After the submission of deliverables, students will be
required undergo an evaluation process (to determine
fulfillment of task requirements.) Further instructions will be
given by the Tutor during the subsequent respective labs. Please
pay attention as failure to adhere to instructions may result in
deduction of marks.
18. Tutor’s note:
In the real working world, satisfactory completion of your tasks
is no longer enough. The ability to add value, communicate
and/or demonstrate your ideas with clarity is just as important
as correct functioning of your program. The grading criteria is
set to imitate such requirements on a ‘smaller scale’.
APPENDIX A
(Sample contents for Maze ‘mazedata.txt’)
Length : 20
Breadth : 10
// ------------------------------
// ----- Start of Maze Data -----
// ------------------------------
// 'S' denotes Starting position
// 'E' denotes Ending position
// '#' denotes Barrier
19. // 'X' denotes Danger Area
####################
#S # # #
# # ## ## ### ###
# # # # E #
## # # X # X ## #
# X ### ##### #
# # # # # ###
# ### ### ## # #####
# # #
####################
APPENDIX B
31. 6
7
8
9
Thread 'POOH' hits a DEAD END near [2, 1] !!
Thread 'TIGGER' has been created !!
Thread 'ROO' has been created !!
===============================================
============
Elapsed Time : 0
Latest Update ...
===============================================
============
Dead End Paths Found : 1
45. 2 # 1 #
3 # 2 3 E
4 # 4 #
5 # 6 5
6 # 7 #
7 # 8 #
8 # 9 10 #
9 # #
Thread 'TIGGER' hits a DEAD END near [2, 1] !!
===============================================
============
Elapsed Time : 1
Latest Update ...
46. ===============================================
============
Dead End Paths Found : 2
Barriers Discovered : 22
Danger Area Discovered : 0
Thread 'TIGGER' hits a DEAD END near [2, 8] !!
===============================================
============
Elapsed Time : 2
Latest Update ...
===============================================
============
Dead End Paths Found : 3
Barriers Discovered : 22
47. Danger Area Discovered : 0
Thread 'ROO' hits a DEAD END near [2, 1] !!
===============================================
============
Elapsed Time : 3
Latest Update ...
===============================================
============
Dead End Paths Found : 4
Barriers Discovered : 22
Danger Area Discovered : 0
Total no. of steps : 7
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 # #
52. 3 # 2 3 E
4 # 4 #
5 # 5 6 X
6 # # 7 8
7 # # # #
8 # #
9 # #
Thread 'TIGGER' stepped into DANGER at [4, 5] !!
===============================================
============
Elapsed Time : 4
Latest Update ...
===============================================
53. ============
Dead End Paths Found : 4
Barriers Discovered : 26
Danger Area Discovered : 1
Thread 'TIGGER' is dead! It's sacrifice shall not be in vain!
Creating new thread 'GOLPHER'
Thread 'GOLPHER' has been created !!
Thread 'POOH' hits a DEAD END near [2, 8] !!
===============================================
============
Elapsed Time : 5
Latest Update ...
===============================================
============
54. Dead End Paths Found : 5
Barriers Discovered : 26
Danger Area Discovered : 1
Total no. of steps : 10
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 # #
1 # S #
2 # 1 #
3 # 2 3 E
4 # 4 #
5 # 5 6 X
6 # # 7 8 9 #
65. 0 # # # #
1 # S # 15 16 #
2 # 1 # 14 #
3 # 2 3 13 12 # E
4 # 4 # 11 #
5 # 5 6 X 10 #
6 # # 7 8 9 #
7 # # # #
8 # # Thread 'ROO' hits a
DEAD END near [2, 8] !!
9 # #
===============================================
============
Elapsed Time : 6
66. Latest Update ...
===============================================
============
Dead End Paths Found : 6
Barriers Discovered : 38
Danger Area Discovered : 1
Thread 'ROO' hits a DEAD END near [5, 1] !!
===============================================
============
Elapsed Time : 7
Latest Update ...
===============================================
============
Dead End Paths Found : 7
68. 8 # #
9 # #
Note :
· There are many pages of other intermediate output that is not
feasible to show in this Appendix.
· We are now skipping straight to the ending portion of the
output.
· Below output show the LAST FEW STEPS of the thread
exploration leading to the discovery of a single, solution path
from Start Location ‘S’ to End Location ‘E’ !!
Total no. of steps : 51
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 # # # # # # # # # # # # # #
1 # S # # 23 24 25 26 33 34 35 36 37
2 # 1 # # # 22 # # 27 32 # # # 38 # #
3 # 2 3 # 21 20 # 28 31 # 40 39 50 49 #
71. Duplicated Paths (to Danger Area) submitted : 0
Total no. of Barrier ('#') discovered : 90 out of 105 !!
Total no. of Danger Area ('X') discovered : 1 out of 3 !!
Printing Thread Statistics !!
---------------------------------------------------------------------------
-----------------
Stats for Thread ID : 3070360432
Found