题目:单词方阵
题目描述:
算法思路分析:
完整代码:
题目描述:
给一 的字母方阵,内可能蕴含多个 yizhong 单词。单词在方阵中是沿着同一方向连续摆放的。 摆放可沿着 个方向的任一方向,同一单词摆放时不再改变方向,
单词与单词之间可以交叉, 因此有可 能共用字母。输出时,将不是单词的字母用 * 代替,以突出显示单词。例如:
输入:
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
q
y
i
z
h
o
n
g
g
y
d
t
h
k
j
y
n
w
i
d
g
h
j
i
o
r
b
z
s
f
g
z
h
h
g
r
h
w
t
h
z
z
z
z
z
o
z
o
i
w
d
f
r
g
n
g
y
y
y
y
g
g
g
g
输出:
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g
* y i z h o n g g y * * * * * * n * i * * * * * o * * z * * * * h * * * h * * * z * * * * o * * i * * * * * n * y * * * * * * g
算法思路分析:
int word[100][100]; //用来存储单词
int visit[100][100]; //表示搜索过程中点的状态
int result[100][100]; //记录搜索的结果(当我全部点都遍历一遍后,如果result[i][j]=0,那么输出'*';否则输出对位的word[i][j])
int site[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,1},{1,1},{1,-1},{-1,-1}}; //表示八个方向
string str="yizhong";
需要遍历每一个点,以当前遍历点作为开始,向八个方向进行搜索,每搜索一点就需要visit[i][j]=1;(搜索的时候要保证我的每一个点在我的word数组中)直到我把str各个字符都比较完,并且
搜索的每一个点和str字符串对位的字符相同。那么表示当前方向的搜索是成功的,那么就将visit数组中值=1的点对应赋值到result数组中。然后回溯到最开始的点(回溯的过程就是visit[i][j]=1
的点进行visit[i][j]=0),进行下一个方向的比较。
void get_result() //该函数是将某个方向遍历成功的结果赋值到result数组中 { //visit数组在回溯的过程中是会改变搜索某个点的结果. for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(visit[i][j]) result[i][j]=visit[i][j]; } } bool judge(int x,int y) //判断搜索的某个点是否超出了word数组的范围 { return (x>=0&&x<n&&y>=0&&y<n)? true:false; }
void dfs(int x,int y,int i,int index) //x y表示从某个开始搜索的点坐标 { // i 表示八个方向的某个方向的坐标的索引值 // index 表示str字符串的索引 if(index==str.size()-1&&word[x][y]==str[index]) //表示当前搜索的点到了str的最后一个索引位 { 置,递归就该终结了 visit[x][y]=1; get_result(); visit[x][y]=0; return; } x+=site[i][0]; y+=site[i][1]; if(judge(x,y)&&word[x][y]==str[index+1]) { visit[x][y]=1; dfs(x,y,i,index+1); visit[x][y]=0; } }
完整代码:
#include"iostream"
#include"string"
using namespace std;
char word[100][100];
int visit[100][100];
int result[100][100];
int site[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,1},{1,1},{1,-1},{-1,-1}};//表示八个方向
int n;
string str="yizhong";
void get_result()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(visit[i][j])
result[i][j]=visit[i][j];
}
}
bool judge(int x,int y)
{
return (x>=0&&x<n&&y>=0&&y<n)? true:false;
}
void print_result()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(!result[i][j])
cout<<'*';
else
cout<<word[i][j];
}
cout<<endl;
}
}
void dfs(int x,int y,int i,int index)
{
if(index==str.size()-1&&word[x][y]==str[index])
{
visit[x][y]=1;
get_result();
visit[x][y]=0;
return ;
}
x+=site[i][0];
y+=site[i][1];
if(judge(x,y)&&word[x][y]==str[index+1])
{
visit[x][y]=1;
dfs(x,y,i,index+1);
visit[x][y]=0;
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>word[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(word[i][j]=='y')
{
for(int k=0;k<8;k++)
{
visit[i][j]=1;
dfs(i,j,k,0);
visit[i][j]=0;
}
}
}
print_result();
return 0;
}