单词方阵 (C语言)

                                                题目:单词方阵

 

题目描述:

 

算法思路分析:

 

     完整代码:


 


       题目描述:


                           给一 的字母方阵,内可能蕴含多个 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

*yizhong
gy******
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;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cfw19990927

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值