这是我读weiss的《Datas tructures and Algorithm Analysis in C》是遇到的一个问题
字谜问题具体描述如下:
求解该问题的代码如下:
#include "stdafx.h"
#include "string.h"
#include "stdlib.h"
#define ROW 4 //字谜面板的行数
#define COLS 4 //字谜面板的列数
int IsExsis(char *word, char puzzleBoard[][4]);
int main()
{
char word1[]="this";
printf("enter a word Please!\n");
scanf("%s", word1);
char puzzleBoard[4][4]=
{
{'t','h','i','s'},
{'w','a','t','s'},
{'o','a','h','g'},
{'f','g','d','t'}
};
if (IsExsis(word1, puzzleBoard))
printf("%s is exsis in the puzzleBoard\n", word1);
else
printf("%s is not exsis in the puzzleBoard\n", word1);
return 0;
}
int IsExsis(char *word,char puzzleBoard[][4])
{
int flag; //使用flag判断连续相同的字母出现的次数
int I,J;
int length;
length = strlen(word); //length代表要找的字符串长度
for (int i=0; i<ROW; i++)
{
for (int j = 0; j < COLS; j++)
{
if (word[0] == puzzleBoard[i][j])
{
I = i;
J = j; //用来保存是字谜板哪一行那一列首次出现word相同的字母
flag = 1;
j++;
for (int k = 1; k < length,j<COLS;j++, k++) //判断同一行是否有单词与word相同
{
if (word[k] == puzzleBoard[i][j])
flag++;
}
if (flag == length) //如果同一行有单词与word相同,则返回1,否则判断同一列
return 1;
else
{
flag = 1;
i = I;
j = J;
i++;
for (int k = 1; k < length, i < ROW; k++, i++) //判断同一列上是否有单词与word相同
{
if (word[k] == puzzleBoard[i][j])
flag++;
}
if (flag == length) //如果同一列上有单词与word相同,则返回1,否则判断右上角
return 1;
else
{
flag = 1;
i = I;
j = J;
i--;
j++;
for (int k = 1; k < length, i>=0 && i < ROW, j < COLS; k++, i--, j++) //判断右上角上是否有单词与word相同
{
if (word[k] == puzzleBoard[i][j])
flag++;
}
if (flag == length) //有则返回1,否则继续判断右下角
return 1;
else
{
flag = 1;
i = I;
j = J;
i++;
j++;
for (int k = 1; k < length, j < COLS, i < ROW; i++, k++, j++) //判断右下角是否有单词与word相同
{
if (word[k] == puzzleBoard[i][j])
flag++;
}
if (flag == length) //有则返回1,否则结束判断
return 1;
}
}
}
}
}
}
return 0;
}
运行结果如下:
分析:
1.该算法的只判断了puzzleBoard中同一行,同一列,右上,右下,四个方向上是否有单词与给定单词匹配。对于其他几个方向没有进行判断。
2.如果puzzleBoard太大,那么该算法执行起来的效率就相当低。