下面是我的代码:
/*
* 编写一个程序求解字谜游戏问题。
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LONGEST_LENGTH 4
#define COL_NUM 4
#define RAW_NUM 4
char ** initPuzzleBorad(char ** puzzleBorad, int col_num, int raw_num);
void displayPuzzleBoard(char ** puzzleBorad, int col_num, int raw_num);
void getWord(int i, int j, int k, int len, char ** dict, char ** puzzleBorad);
void inWordDict(char ** dict, char ** puzzleBorad, char * testedWord);
int charArrayCmp(char * char1, char * char2);
void printChar(char * c)
{
int i = 0;
while(c[i] != '\n')
{
printf("%c",c[i]);
i++;
}
printf("\n");
}
/*
* 获得键盘上输入的最后一个字符,除了回车。
*/
char getAChar()
{
char tempChar,realChar,firstChar;
int i = 0;
realChar = '\n';
do
{
while ((tempChar = getchar()) != '\n')
{
realChar = tempChar;
if (i == 0)
{
i = 1;
firstChar = realChar;
}
}
if (realChar == '\n')
{
printf("your input is: enter, input again:");
}
else if(realChar != firstChar)
{
printf("your input: %c \n", realChar);
}
} while (realChar =='\n');
return realChar;
}
/*
* 获得puzzle board
*/
char ** getPuzzleBorad(int col_num, int raw_num)
{
char ** puzzleBorad = (char **)malloc(sizeof(char *) * raw_num);
int i = 0;
for(i = 0; i < col_num; i++)
{
*(puzzleBorad + i) = (char *)malloc(sizeof(char)*col_num);
}
puzzleBorad = initPuzzleBorad(puzzleBorad, col_num, raw_num);
return puzzleBorad;
}
/*
* 初始化puzzle board
*/
char ** initPuzzleBorad(char ** puzzleBorad, int col_num, int raw_num)
{
while (1)
{
int i = 0;
int j = 0;
char aChar, asure;
for(i = 0; i < raw_num; i++)
{
for(j = 0; j < col_num; j++)
{
printf("please input char[%d][%d]:",i,j);
aChar = getAChar();
*(*(puzzleBorad + i) + j) = aChar;
}
}
printf("be sure that your input is:\n");
displayPuzzleBoard(puzzleBorad, col_num, raw_num);
asure = 'n';
printf("are your input is correct?y/n \n");
asure = getAChar();
while (!(asure == 'y' || asure == 'n'))
{
printf("your input is: %c, please input y or n!\n", asure);
asure = getAChar();
}
if(asure == 'y')
{
return puzzleBorad;
}
else
{
printf("please input your data again\n");
}
}
}
/*
* 显示puzzleBorad
*/
void displayPuzzleBoard(char ** puzzleBorad, int col_num, int raw_num)
{
int i,j;
for(i = 0; i < raw_num; i++)
for(j = 0; j < col_num; j++)
{
printf("%c ",*(*(puzzleBorad + i) + j));
if(j == col_num - 1)
{
printf("\n");
}
}
}
/*
* 遍历puzzle board
*/
void ergodicPuzzleBorad(char ** puzzleBorad, int col_num, int raw_num, char ** wordDict)
{
// 遍历每个位置
int i,j,k;
for(i = 0; i < raw_num; i++)
{
for(j = 0; j < col_num; j++)
{
for(k = 0; k < 8; k++)
{
// printf("position is %d hang %d lie %d fangxiang\n", i, j, k);
getWord(i,j,k,LONGEST_LENGTH,wordDict,puzzleBorad);
}
}
}
}
/*
* i: 行 j:列 k:方向
* 获得一个字符序列
*/
void getWord(int i, int j, int k, int len, char ** dict, char ** puzzleBorad)
{
char * temp = (char *)malloc(sizeof(char)*len*2);
int count = 0;
for(count = 0; count < len; count++)
temp[count] = 'A';
switch(k)
{
case 0: // upper
for(count = 0; count < len; count++)
{
*(temp + count) = *(*(puzzleBorad + i) + j);
*(temp + count + 1) = '\n';
// printf("the word getted is:");
// printChar(temp);
inWordDict(dict, puzzleBorad, temp);
i--;
if(i == -1) break;
}
break;
case 1: // down
for(count = 0; count < len; count ++)
{
*(temp + count) = *(*(puzzleBorad + i) + j);
*(temp + count + 1) = '\n';
// printf("the word getted is:");
// printChar(temp);
inWordDict(dict, puzzleBorad, temp);
i++;
if(i == RAW_NUM) break;
}
break;
case 2: // left
for(count = 0; count < len; count ++)
{
*(temp + count) = *(*(puzzleBorad + i) + j);
*(temp + count + 1) = '\n';
// printf("the word getted is:");
// printChar(temp);
inWordDict(dict, puzzleBorad, temp);
j--;
if(j == -1) break;
}
break;
case 3: // right
for(count = 0; count < len; count ++)
{
*(temp + count) = *(*(puzzleBorad + i) + j);
*(temp + count + 1) = '\n';
// printf("the word getted is:");
// printChar(temp);
inWordDict(dict, puzzleBorad, temp);
j++;
if(j == COL_NUM) break;
}
break;
case 4: // upper right
for(count = 0; count < len; count ++)
{
*(temp + count) = *(*(puzzleBorad + i) + j);
*(temp + count + 1) = '\n';
// printf("the word getted is:");
// printChar(temp);
inWordDict(dict, puzzleBorad, temp);
i--;j++;
if(i == -1 || j == COL_NUM) break;
}
break;
case 5: // upper left
for(count = 0; count < len; count ++)
{
*(temp + count) = *(*(puzzleBorad + i) + j);
*(temp + count + 1) = '\n';
// printf("the word getted is:");
// printChar(temp);
inWordDict(dict, puzzleBorad, temp);
i--;j--;
if(i == -1 || j == -1) break;
}
break;
case 6: // down right
for(count = 0; count < len; count ++)
{
*(temp + count) = *(*(puzzleBorad + i) + j);
*(temp + count + 1) = '\n';
// printf("the word getted is:");
// printChar(temp);
inWordDict(dict, puzzleBorad, temp);
i++;j++;
if(i == RAW_NUM || j == COL_NUM) break;
}
break;
case 7: // down left
for(count = 0; count < len; count ++)
{
*(temp + count) = *(*(puzzleBorad + i) + j);
*(temp + count + 1) = '\n';
// printf("the word getted is:");
// printChar(temp);
inWordDict(dict, puzzleBorad, temp);
i++;j--;
if(i == RAW_NUM || j == -1) break;
}
break;
default:
printf("error: no such directory!");
}
free(temp);
}
void inWordDict(char ** dict, char ** puzzleBorad, char * testedWord)
{
int i = 0;
int maxNumWord = 4;
for(i = 0; i < maxNumWord; i++)
{
// printf("the word 1 is:%s\n",testedWord);
// printf("the word 2 is:%s\n",dict[i]);
// printf("------------------------");
if(charArrayCmp(testedWord, dict[i]) == 0)
{
printf("the puzzle board has the word:%s\n",dict[i]);
}
}
}
int charArrayCmp(char * char1, char * char2)
{
int i = 0;
while (char1[i] !='\n' && char2[i] != '\n')
{
// printf("%d-th char is %c in char1 and %c in char2\n",i, char1[i], char2[i]);
if(char1[i] != char2[i])
return 1;
i++;
}
return 0;
}
int main()
{
char *wordDict[4] = {"this", "two", "fat", "that"}; //字典
char ** puzzleBoard = getPuzzleBorad(COL_NUM, RAW_NUM);
ergodicPuzzleBorad(puzzleBoard,COL_NUM,RAW_NUM, wordDict);
free(puzzleBoard);
printf("program finished!");
}