String- 单词方阵

题目:

单词方阵

完整代码如下:

#include<stdio.h>
int n;//方阵长度
int p,q;//记录起点
char b[101];
char a[101][101];
int book[101][101];
char c[] = "yizhong";
int next[8][2] = {{0,1},{1,1},{1,0},{-1,-1},{0,-1},{1,-1},{-1,0},{0,1}};
void maching(int x, int y)
{
	int k, i;
	for (k = 0; k <=8; k++)
	{
		int tx = x;
		int ty = y;
		int xx = x;
		int yy = y;
		for (i=1;i<=6;i++)
		{
			tx+=next[k][0];
			ty+=next[k][1];
			if ((tx<0 || tx>n - 1 || ty<0 || ty>n - 1) || a[tx][ty] != c[i])
				break;
		}
		if (i == 7)
		{
			book[xx][yy] = 1;
			for (i = 1; i <= 6; i++)
			{
				xx += next[k][0];
				yy += next[k][1];
				book[xx][yy] = 1;
			}
		}
	}
}
int main()
{
	scanf("%d", &n);
	getchar();//吸收回车
	for (int i = 0; i < n; i++)
	{
		scanf("%s",b);
		for (int j = 0; j < n; j++)
			a[i][j] = b[j];
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			if (a[i][j] == c[0])
				maching(i, j); 
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (book[i][j] == 0)
				printf("*");
			else
				printf("%c", a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

题目解析:

一共有8个方向所以我们先找到字符串的起始位点 ‘y’然后以此为基准点便利8个方向
每个方向都需要沿齐方向往下找6个字符,并在找的同时类比原字符串
寻找成功后(for循环自动结束),再以基准点往该方向标记字符位点
输出时,未标记的输出 ‘*’ 标记过的输出原字符串

第一步(读入)

	scanf("%d", &n);
	getchar();//吸收回车
	for (int i = 0; i < n; i++)
	{
		scanf("%s",b);//借用一维数组
		for (int j = 0; j < n; j++)
			a[i][j] = b[j];
	}

第二步(寻找起始位点然后去maching)

for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			if (a[i][j] == c[0])//char c[] = "yizhong";
				maching(i, j); 
	}

第三步(maching(匹配)函数内部操作)

void maching(int x, int y)
{
	int k, i;
	for (k = 0; k <=8; k++)//mathing 8 个方向
	{
		int tx = x;
		int ty = y;
		int xx = x;
		int yy = y;
		//一组用来试探匹配字符串
		//一组用来染色(标记)字符串
		//目的:保证8个方向的mathing的起始位点不变
		for (i=1;i<=6;i++)//每个方向走6步
		{
			tx+=next[k][0];
			ty+=next[k][1];
			if ((tx<0 || tx>n - 1 || ty<0 || ty>n - 1) || a[tx][ty] != c[i])
			//判断是否越界且是否与字符串匹配
			//不满足条件提前跳出循环
				break;
		}
		if (i == 7)//for循环自动结束(即成功找到)
		{
			book[xx][yy] = 1;//标记起始位点
			for (i = 1; i <= 6; i++)//标记剩余位点
			{
				xx += next[k][0];
				yy += next[k][1];
				book[xx][yy] = 1;
			}
		}
	}
}

第四步(输出)

for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (book[i][j] == 0)
				printf("*");
			else
				printf("%c", a[i][j]);
		}
		printf("\n");
	}

重点部分(2):
①读入:用一维数组导入二维数组(前不能有回车符号)
②起点保存两组(保证8个方向的mathing的起始位点不变)

END

上一篇:黑客帝国特效(html+css+js)


下一篇:DFS【搜索1】