题目描述
给一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");
}
}