单词方阵

题目描述

给一n×n的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:

输入:
8                     输出:
qyizhong              yizhong
gydthkjy              gy******
nwidghji              n*i*****
orbzsfgz              o**z****
hhgrhwth              h***h***
zzzzzozo              z****o**
iwdfrgng              i*****n*
yyyygggg              y******g

输入输出格式

输入格式:

第一行输入一个数n。(7≤n≤100)。

第二行开始输入n×n的字母矩阵。

输出格式:

突出显示单词的n×n矩阵。

输入输出样例

输入样例#1:

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

输出样例#1:

*******
*******
*******
*******
*******
*******
*******

思路:dfs

八个方向搜索

第一版(较复杂):

#include<stdio.h>
int n;
char a[102][102];
int use[102][102];
char word[8]="yizhong";
int k;
void search(int x,int y,int t,int dis)
{
	int i,j;
	if(t==7)
	{
		k=1;
		if(dis==1)
			for(i=x+1;k<8;i++,k++)
				use[i][y]=1;
		else if(dis==2)
			for(i=x+1,j=y-1;k<8;i++,j--,k++)
				use[i][j]=1;
		else if(dis==3)
			for(i=y-1;k<8;i--,k++)
				use[x][i]=1;
		else if(dis==4)
			for(i=x-1,j=y-1;k<8;i--,j--,k++)
				use[i][j]=1;
		else if(dis==5)
			for(i=x-1;k<8;i--,k++)
				use[i][y]=1;
		else if(dis==6)
			for(i=x-1,j=y+1;k<8;i--,j++,k++)
				use[i][j]=1;
		else if(dis==7)
			for(i=y+1;k<8;i++,k++)
				use[x][i]=1;
		else if(dis==8)
			for(i=x+1,j=y+1;k<8;i++,j++,k++)
				use[i][j]=1;
		return ;
	}
	else if(dis==1)
	{
		if(a[x][y]==word[t])
			search(x-1,y,t+1,1);
		else
			return ;
	}	
	else if(dis==2)
	{
		if(a[x][y]==word[t])
			search(x-1,y+1,t+1,2);
		else
			return ;
	}
	else if(dis==3)
	{
		if(a[x][y]==word[t])
			search(x,y+1,t+1,3);
		else
			return ;
	}
	else if(dis==4)
	{
		if(a[x][y]==word[t])
			search(x+1,y+1,t+1,4);
		else
			return ;
	}
	else if(dis==5)
	{
		if(a[x][y]==word[t])
			search(x+1,y,t+1,5);
		else
			return ;
	}
	else if(dis==6)
	{
		if(a[x][y]==word[t])
			search(x+1,y-1,t+1,6);
		else
			return ;
	}
	else if(dis==7)
	{
		if(a[x][y]==word[t])
			search(x,y-1,t+1,7);
		else
			return ;
	}
	else if(dis==8)
	{
		if(a[x][y]==word[t])
			search(x-1,y-1,t+1,8);
		else
			return ;
	}
}
int main(void)
{
	int i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%s",a[i]);
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(a[i][j]==word[0])                   剪枝(但感觉减少不了多少运行时间)
			{
				if(i<=n-7)
				{
					search(i+1,j,1,5);if(j>=6)
						search(i+1,j-1,1,6);       左下  
					if(j<=n-7)
						search(i+1,j+1,1,4);       右下  
				}
				if(i>=6) 
				{
					search(i-1,j,1,1);if(j>=6)
						search(i-1,j-1,1,8);       左上  
					if(j<=n-7) 
						search(i-1,j+1,1,2);       右上  
				}

				if(j<=n-7)
					search(i,j+1,1,3);if(j>=6) 
					search(i,j-1,1,7);}	
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(use[i][j]==1)
				printf("%c",a[i][j]);
			else
				printf("*");
		}
		printf("\n");
	}
}

发现八个方向就是行列 +1 -1 +0 稍微修改了一下代码

第二版:

#include<stdio.h>
int n;
char a[102][102];
int use[102][102];
char word[8]="yizhong";
int k;
int ans[10][2]={{0,0},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
void search(int x,int y,int t,int f)
{
	int i,j;
	if(t==7)
	{
		k=1;
		int s1=ans[f][0];
		int s2=ans[f][1];
		for(i=x-s1,j=y-s2;k<8;i-=s1,j-=s2,k++)
				use[i][j]=1;
		return ;
	}
	else
	{
		if(a[x][y]==word[t])
			search(x+ans[f][0],y+ans[f][1],t+1,f);
		else
			return ;
	}
}
int main(void)
{
	int i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%s",a[i]);
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(a[i][j]==word[0])
			{
				search(i+ans[1][0],j+ans[1][1],1,1); 
				search(i+ans[2][0],j+ans[2][1],1,2); 
				search(i+ans[3][0],j+ans[3][1],1,3); 
				search(i+ans[4][0],j+ans[4][1],1,4); 
				search(i+ans[5][0],j+ans[5][1],1,5); 
				search(i+ans[6][0],j+ans[6][1],1,6); 
				search(i+ans[7][0],j+ans[7][1],1,7); 
				search(i+ans[8][0],j+ans[8][1],1,8); 			
			}	
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(use[i][j]==1)
				printf("%c",a[i][j]);
			else
				printf("*");
		}
		printf("\n");
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值