luogu1101:单词方阵:字符串的匹配问题

题目连接:该题是luogu试炼场的2-7:T3


题目大意:
1 给一个n*m的字符矩阵,寻找八个方向中,能凑成“yizhong”的字符;
2 按要求输出;


解题思路:
1 想了很久,没发现怎么用搜索,然后枚举一遍就搞定了:
2 每个点都尝试做开头,然后向八个方向进行字符匹配,完。


上代码:

//luogu1101 单词方阵 
// 八个方向的判断 
// 没有搜索的东西在吧? 
 
#include<cstdio>
#include<cstring>

int dx[8]={0,1,1,1,0,-1,-1,-1};
int dy[8]={1,1,0,-1,-1,-1,0,1};
char st[10]={"0yizhong"};
int n,b[110][110];
char m[110][110],s[11]={"0y"};

void pd(int x,int y)
{
	for(int i=0;i<8;i++)
	{	
		int bx=x+6*dx[i];
		int by=y+6*dy[i];
		//单词末尾是否会越界 
		if(bx>=1&&bx<=n&&by>=1&&by<=n)
		{
			int nx=x+dx[i];
			int ny=y+dy[i];
			for(int j=2;j<=7;j++)//将2-7的字母放入s[]中 
			{
				s[j]=m[nx][ny];
				nx+=dx[i];
				ny+=dy[i];
			}
			s[8]='\0';
			
			if(strcmp(s,st)==0)//符合条件的位置,标记 
			{	
				b[x][y]=1;
				nx=x+dx[i];
				ny=y+dy[i];
				for(int j=2;j<=7;j++)
				{
					b[nx][ny]=1;
					nx+=dx[i];
					ny+=dy[i];
				}
			}
		}	
	}

}
int main()
{
	scanf("%d",&n);
	memset(b,0,sizeof(b));
	for(int i=1;i<=n;i++)
	{
		scanf("%s",m[i]+1);	
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(m[i][j]==st[1])//每个位置都当开头,向8个方向试一遍 
			{
				pd(i,j);
			}
		}
	}
	
	//输出 
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(b[i][j]==0) printf("*");
			else printf("%c",m[i][j]);
		}
		printf("\n");
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/liusu201601/article/details/89022071
今日推荐