题目:
单词方阵
完整代码如下:
#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的起始位点不变)