华为机试

找到它是个小游戏,你需要在一个矩阵中找到给定的单词,假设给定单词HELLOWORLD,在矩阵中只要能找到H->E->L->L->O->W->O->R->L->D连成的单词,就算通过。

注意区分英文字母大小写,并且你只能上下左右行走,不能走回头路。

输入描述:

输入第一行包含两个整数n、m(0<n,m<21),分别表示n行m列的矩阵,第二行时长度不超过100的单词W(在整个矩阵中给定单词只会出现一次),从第三行到到第n+2行时只包含大小写英文字母的长度为m的字符串矩阵。

输出描述:

如果能在矩阵中连成给定的单词,则输出给定单词首字母在矩阵中的位置(第几行 第几列),否则输出“NO”

示例1

输入

5 5

HELLOWORLD

CPUCY

EKLQH

CHELL

LROWO

DGRBC

输出

3 2

解题

#include<stdio.h>
#include<string.h>
#include<malloc.h>
//#pragma region MyRegion
///*
//在矩阵中只要能找到H->E->L->L->O->W->O->R->L->D连成的单词,
//*/
//#pragma endregion
//

const int Max = 5;
char matrix[Max][Max];
char keyword[] = { 'H', 'E', 'L', 'L', 'O', 'W', 'O', 'R', 'L', 'D' };
bool isUsed [Max][Max];
int X=-1;
int Y=-1;

void copy(char*A, char*B,int count){
	for (int i = 0; i < Max; i++)
	{
		{
			A[i] = B[i];
		}
	}
}
void setValue()
{
	char *temp = (char*)malloc(Max*sizeof(char));
	char s0[] = { 'C', 'P', 'U', 'C', 'Y' };
	char s1[] = { 'E', 'K', 'L', 'Q', 'H' };
	char s2[] = { 'C', 'H', 'E', 'L', 'L' };
	char s3[] = { 'L', 'R', 'O', 'W', 'O' };
	char s4[] = { 'D', 'G', 'R', 'B', 'C' };
	copy(matrix[0], s0, Max);
	copy(matrix[1], s1, Max);
	copy(matrix[2], s2, Max);
	copy(matrix[3], s3, Max);
	copy(matrix[4], s4, Max);
	for (int i = 0; i < Max; i++)
	{
		for (int j = 0; j < Max; j++)
		{
			isUsed[i][j] = false;
		}
	
	}
}
void printfMatrix()
{
	printf("\n");
	for (int i = 0; i < Max; i++)
	{
		for (int j = 0; j < Max; j++)
		{
			printf("%c ", matrix[i][j]);
		}
		printf("\n");
	}
}
void printfisUsed()
{
	printf("\n");
	for (int i = 0; i < Max; i++)
	{
		for (int j = 0; j < Max; j++)
		{
			printf("%d", isUsed[i][j]);
		}
		printf("\n");
	}
}

bool find(int i, int j, int keyWordIndex)
{
	int direction[4][2] = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
	int ni = i;
	int nj = j;
	isUsed[i][j] = true;
	if (keyWordIndex == strlen(keyword)-1 && matrix[i][j] == keyword[keyWordIndex])
	{
		bool falg = false;
		for (int i = 0; i < Max; i++)
		{
			for (int j = 0; j < Max; j++)
			{
				if (isUsed[i][j] == true)
				{
					if (!falg)
					{
						X = i;
						Y = j;
					}
					falg = true;
				}
			}
		}
		return true;
	}
	if (matrix[i][j] == keyword[keyWordIndex])
	{
		printfisUsed();
		for (int i = 0; i < 4; i++)
		{
			int tempi = ni + direction[i][0];
			int tempj = nj + direction[i][1];
			if (tempi >= 0 && tempi<Max && tempj >= 0 && tempj < Max && isUsed[tempi][tempj] == false)
			{
				find(tempi, tempj, keyWordIndex + 1);
			}
		}
	}
	isUsed[i][j] = false;
	return false;

}

int main()
{
	setValue();
	printfMatrix();
	for (int i = 0; i < Max; i++)
	{
		for (int j = 0; j < Max; j++)
		{
			find(i, j, 0);
		}
	}
	printf("%d %d", X, Y);
	return 0;
}


全部评论
自己造了数据,加了打印,可以直接跑
点赞 回复 分享
发布于 2023-06-16 17:26 浙江

相关推荐

吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
03-29 12:10
门头沟学院 C++
挣K存W养DOG:散漫消极者淘汰,一眼坑爹。实习几个月转正的时候说你加班太少,能力还行态度不够积极裁了,马上老实。
点赞 评论 收藏
分享
评论
7
11
分享

创作者周榜

更多
牛客网
牛客企业服务