求解字谜问题的一种方法

这是我读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太大,那么该算法执行起来的效率就相当低。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值