单词方阵(dfs)

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

输入:

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)。

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

输出格式:
突出显示单词的nXn矩阵。

输入输出样例
输入样例#1:

7

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa
输出样例#1:

#######

#######

#######

#######

#######

#######

#######

典型的深搜,就是过程有点麻烦,先规定一个字符串yizhong,深度每增加1,对应字符串位置加一。
AC代码;
#include <bits/stdc++.h>

using namespace std;

int c[110][110]={0};

char bb[30]="yizhong";

int b[110][2]={0};

int n;

char a[110][110];

void dfs(int x,int y,int t,int fang)//fang是记录方向;t记录深度;

{

    if(t==7)//代表成功,用C字符串记录;
    {
        for(int i=0;i<7;i++)
        {
            c[b[i][0]][b[i][1]]=1;
        }
    }
    else
    {
    if(fang==1)
    {
         if(x-1>=0&&y-1>=0&&a[x-1][y-1]==bb[t])
         {
             b[t][0]=x-1;
             b[t][1]=y-1;
             dfs(x-1,y-1,t+1,fang);
         }
    }
    else if(fang==2)
    {
         if(y-1>=0&&a[x][y-1]==bb[t])
         {
             b[t][0]=x;
             b[t][1]=y-1;
             dfs(x,y-1,t+1,fang);
         }
    }
    else if(fang==3)
    {
         if(y+1<n&&x+1<n&&a[x+1][y+1]==bb[t])
         {
             b[t][0]=x+1;
             b[t][1]=y+1;
             dfs(x+1,y+1,t+1,fang);
         }
    }
    else if(fang==4)
    {
         if(x+1<n&&a[x+1][y]==bb[t])
         {
             b[t][0]=x+1;
             b[t][1]=y;
             dfs(x+1,y,t+1,fang);
         }

    }
    else if(fang==5)
    {
         if(y-1>=0&&x+1<n&&a[x+1][y-1]==bb[t])
         {
             b[t][0]=x+1;
             b[t][1]=y-1;
             dfs(x+1,y-1,t+1,fang);
         }
    }
    else if(fang==6)
    {
        if(y+1<n&&a[x][y+1]==bb[t])
         {
             b[t][0]=x;
             b[t][1]=y+1;
             dfs(x,y+1,t+1,fang);
         }
    }
    else if(fang==7)
    {
         if(y+1<n&&x-1>=0&&a[x-1][y+1]==bb[t])
         {
             b[t][0]=x-1;
             b[t][1]=y+1;
             dfs(x-1,y+1,t+1,fang);
         }
    }
    else if(fang==8)
    {
        if(x-1>=0&&a[x-1][y]==bb[t])
         {
             b[t][0]=x-1;
             b[t][1]=y;
             dfs(x-1,y,t+1,fang);
         }
    }
    }

}

int main()
{

   scanf("%d",&n);

   for(int i=0;i<n;i++)

   {

       scanf("%s",&a[i]);
   }

   for(int i=0;i<n;i++)

   {

       for(int j=0;j<n;j++)
       {
           if(a[i][j]==‘y‘)
           {
               b[0][0]=i;//这里要把第一个位置标记一下,因为dfs函数没记录第一个;
               b[0][1]=j;
               for(int w=1;w<=8;w++)
               {
                   dfs(i,j,1,w);
               }
           }
       }
   }

   for(int i=0;i<n;i++)

   {

       for(int j=0;j<n;j++)
       {
           if(c[i][j]==0)
           {
               printf("*");
           }
           else
           {
               printf("%c",a[i][j]);
           }
       }
       printf("\n");
   }
    return 0;
}

原文地址:https://www.cnblogs.com/xiaolaji/p/9124994.html

时间: 2024-10-11 01:37:08

单词方阵(dfs)的相关文章

Luogu P1101 单词方阵

明明是一道水题,我还找不出 bug 来...原本在 DFS 途中记录单词串,只好使用笨方法,在结尾加一个 for 记录单词串.终于过了. 思路:枚举图中每一个点进行 DFS,途中判断访问的点是否为连续元素("yizhong"字符串中连续),如果不是返回:进行下一层 DFS,如果返回值 True 则直接层层返回 True,强行退出. 1 /* P1101 单词方阵 2 * Au: GG 3 */ 4 #include <cstdio> 5 #include <cstdl

P1101 单词方阵【洛谷】

//题目----------------------------------------------------------------------------------------- 传送门: http://www.luogu.org/problem/show?pid=1101 P1101 单词方阵 题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=

P1101 单词方阵 简单dfs

题目描述 给一n \times nn×n的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母.输出时,将不是单词的字母用*代替,以突出显示单词.例如: 输入: 8 输出: qyizhong *yizhong gydthkjy gy****** nwidghji n*i***** orbzsfgz o**z**** hhgrhwth h***h*** zzz

DFS(单词方阵)

思路: 先把地图二维字符数组存进去之后,遍历寻找到一个‘y’,然后我们可以设置一个八个方向的方向数组,让‘y’的坐标,遍历加上方向坐标,找到’i‘然后沿着这个方向,dfs下去,每次寻找到正确的,然后建立一个结构体存下点的坐标,然后设置bool数组标记坐标位置,最后再遍历输出,当bool数组为true时,正常输出,当bool数组为false时,输出’*‘. 代码如下: #include<bits/stdc++.h> using namespace std; typedef long long l

luogu 1101单词方阵

题目描述 给一nXn的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母.输出时,将不是单词的字母用"*"代替,以突出显示单词.例如: 输入: 8 输出: qyizhong *yizhong gydthkjy gy****** nwidghji n*i***** orbzsfgz o**z***

洛谷——P1101 单词方阵

https://www.luogu.org/problem/show?pid=1101#sub 题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母.输出时,将不是单词的字母用“*”代替,以突出显示单词.例如: 输入: 8 输出: qyizhong *yizhong gydthkjy gy****** n

洛谷P1101 单词方阵——S.B.S.

题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母.输出时,将不是单词的字母用“*”代替,以突出显示单词.例如: 输入: 8 输出: qyizhong *yizhong gydthkjy gy****** nwidghji n*i***** orbzsfgz o**z**** hhgrhwth h***

洛谷 P1101 单词方阵

不算搜索的搜索 思路和很多人的一样,因为只要找到两个字母,方向就确定了,记录下方向,剩下的暴力即可. #include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n; int fx[9][2]={{0,0},{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};//存方向,循环起来比较方便 char map[101

P1278 单词游戏 - DFS

P1278 单词游戏 传送门 Sol: 枚举词典中的每个单词,然后跑DFS.再加个记忆化就不会T了. AC Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 16 + 4,M = 100 + 10; int n; char S[N][M]; int len[N]; int f[N][1<<N]; int dfs(int