Code Competition(3)
A.First Edition
This is actually first edition of Code Competition 3. (Click to see the problem)
1¡£ Basic idea:
This is from last year of "Code Competition" of "Concordia Computer Science Association"(CCSS)
This is the second simplest one among 4 problems.(I guess that as I browse the result and most of them only
figour out this one and the no 2 problem.) It is actually a common job in data structure courses. I finished
after more then 3 hours. I guess I won't become the winning team as I think I am not the kind of coding fast.
2¡£ Program design:
Actually it is not a very difficult problem compared with "Baggles" which I coded with Delphi in Toronto which
is the assignment of "University York". It is also said to be originally from "MIT" or "Standford" or somewhere.
That problem is actually a small project which involes "lexico", "depth first search", and other data structure
skills. I only finished these two parts. Stop this!
Let's talk about something of problem. The input quite cost a lot of job. I made a mistake when reading number
with more than 1 digit. I used a recursive function "doSearch()" which move to new position by original "direction"
and "word" with first letter "missing". I just move the pointer of "word" by 1. The recursive function doSearch
return write a "Pos" struct to a "Pos*" array when it find out the "word" is only one letter left.
3¡£ Major function£º
A. void inputFile(char* fileName)
This function is quite long as I didn't expect to add so many parts in together. First it read in the "dimention" of
array which give some trouble as I only expect one digit number. Then it just read the length of a word first then read in the
word until read 0;
B. void searchWord(char* word)
This function first find the pos match the first char of "word" and then call "scanWord".
C. void scanWord(int i, int j, char* word)
void doSearch(int i, int j, char* pWord, Direction dir);
within "scanWord" there is the recursive function of "doSearch" which "move" from current co-ordinate(i,j) to next position
calculated by "Direction"---dir. The function "testDir" test next position also return next destination co-ordinate. Then
the function just pass new co-ordinate, original direction, and "word" with first char "missing"(move the pointer by 1) to
recursive call itself. "doSearch" stop to add new struct of "Pos" to a list when he found the "word" is only one char.
D. bool testDir(int& row, int& col, Direction dir)
A standard moving test function. I think it is exactly same as my old "Delphi" function which I lost when my old laptop
choose to suitcide.
4¡£ Further improvement£º
A. This simple program cost me almost 3 hours.
B. I forgot to delete dynamically allocated memory at end of execution.
#include <iostream> #include <fstream>
using namespace std;
enum Direction {LeftUp, Up, RightUp, Right, RightDown, Down, LeftDown, Left};
const MaxDim = 100;
const MaxWordCount = 100;
const MaxRec = 200;
struct Pos { char* word; int startRow; int startCol; int endRow; int endCol; };
Pos* record[MaxRec];
int recordCount =0;
Pos start;
char * words[MaxWordCount];
char matrix[MaxDim][MaxDim];
int dim = 0;
int wordCount =0;
void inputFile(char* fileName);
void outputFile(char * fileName);
void searchWord(char* word);
void scanWord(int i, int j, char* word);
bool testDir(int& row, int& col, Direction dir);
int main() { inputFile("c:\\nickinput.txt"); outputFile("c:\\nickoutput.txt"); return 0; }
void outputFile(char* fileName) { ofstream f; f.open(fileName); for (int i=0; i<recordCount; i++) { f<<record[i]->word<<" "<<record[i]->startRow<<" "<<record[i]->startCol; f<<" "<<record[i]->endRow<<" "<<record[i]->endCol<<"\n"; } }
void inputFile(char* fileName) { FILE* stream; char buffer[20]; char * ptr; char ch; int len=0; stream = fopen(fileName, "r"); ch = fgetc(stream);
while (isdigit(ch)) { dim = 10 * dim + atoi(&ch); ch = fgetc(stream); }
for (int i=0; i< dim; i++) { for (int j=0; j<dim; j++) { matrix[i][j] = ch; ch = fgetc(stream); } } while (!isalnum(ch)) { ch = fgetc(stream); //eat non alpha number } while(true) { len =0; while(isdigit(ch)) { len = len*10 + atoi(&ch); ch = fgetc(stream); } if (len==0) break; ptr = buffer; for (i=0; i< len; i++) { *ptr = ch; ch = fgetc(stream); ptr++; } *ptr = '\0'; words[wordCount] = (char*)malloc(len+1); strcpy(words[wordCount], buffer); wordCount++;
} for (i=0; i< wordCount; i++) { searchWord(words[i]); } }
bool testDir(int& row, int& col, Direction dir) { int i = row, j = col; switch(dir) { case LeftUp: i--; j--; break; case Up: i--; break; case RightUp: i--; j++; break; case Right: j++; break; case RightDown: i++; j++; break; case Down: i++; break; case LeftDown: i++; j--; break; case Left: j--; break; } if (i<0||j<0||i>=dim||j>=dim) { return false; } else { row = i; col = j; return true; } }
void searchWord(char* word) { for (int i =0; i<dim; i++) { for (int j=0; j< dim; j++) { if (matrix[i][j]==*word) { scanWord(i, j, word); } } } }
void doSearch(int i, int j, char* pWord, Direction dir) { if (*pWord == matrix[i][j]) { if (strlen(pWord)==1) { Pos * ptr = new Pos; ptr->word = start.word; ptr->startRow = start.startRow; ptr->startCol = start.startCol; ptr->endRow = i; ptr->endCol = j; record[recordCount] = ptr; recordCount++; return; } else { if (testDir(i, j, dir)) { doSearch(i, j, pWord+1, dir); } } } }
void scanWord(int i, int j, char* word) { int row = i, col = j; char *ptr = word; void doSearch(int i, int j, char* pWord, Direction dir);
for (int dir = LeftUp; dir<= Left; dir++) { start.word = word; ptr = word; row = i; col = j; start.startRow = i; start.startCol = j; doSearch(row, col, ptr, (Direction)dir); } }
This is input file contents:
21
trihsyffupjsizanpuoscjracyllemsoxcdtkqkhprsulhecrlnvnhoomtnveeadinjakqtkhvacesriabnzyarixtvxvnozktltqprfykglbojvcwuiznjveacrf
jnonaerbeetgiarsclnkmokmnishmcvthpyefdaczyeyscahgtirctsangromnadoomjmtignnsedndndvxuakchttrobhtciaeeckllbvpuddyyenwdapyrbweqx
rozorbukwttprpabazmkkolkjccmcgpeuqodnnbrafragvbqgimltpopaiisrnntnehwjbvfitdjbyeacrtwsiooizdvwxcdtuatrnnxsekrsbbzfhvukxmdsbsnn
eaxgqigafcbffenaqvperzmbegaknirhswmyekardehteelainebenesrsxkramerm
7maestro12yadayadayada8soupnazi5cosmo11elainebenes8costanza6kramer12aboutnothing5frank6george6newman14crazyjoedavola8
uncleleo9smellycar10juniormint8thedrake10puffyshirt7thebris12poppiespizza6mickey9shrinkage8bigsalad5bania13jonvoightscar6
mrpitt5puddy12steinbrenner9jpeterman0
This is output file contents:
maestro 18 19 12 19
yadayadayada 7 12 18 12
soupnazi 0 19 0 12
cosmo 10 1 6 1
elainebenes 20 0 20 10
costanza 1 12 8 19
kramer 20 14 20 19
aboutnothing 16 12 5 1
frank 5 19 1 15
george 14 0 19 0
newman 9 13 14 18
crazyjoedavola 0 20 13 20
uncleleo 9 19 2 12
smellycar 1 9 1 1
juniormint 1 0 10 9
thedrake 19 19 19 12
puffyshirt 0 9 0 0
thebris 8 6 2 0
poppiespizza 14 11 3 11
mickey 14 6 19 11
shrinkage 19 8 19 0
bigsalad 10 7 3 0
bania 11 14 15 14
jonvoightscar 0 10 12 10
mrpitt 6 19 1 14
puddy 11 0 11 4
steinbrenner 17 13 6 13
jpeterman 15 10 7 2