【单词方阵】蒟蒻题解

题目:传送门


题外闲话

这道题是一个\(DFS\)(深度优先搜索 \(Depth\) \(Frist\) \(Sreach\))的题目,可是…我就是不想敲递归(我绝对不会告诉你我是想偷懒的),于是就有了这个程序和这篇题解……

题目分析

首先,这是一个二维的题目,要寻找8个方向,如下图所示:

(-1,-1) (-1, 0) (-1, 1)
( 0,-1) 在这向八个方向寻找 ( 0,1)
(1,-1) (1,0) (1,1)

所以,要预处理八个方向:

int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};

还有,这题还需要做一个染色处理,碰到符合情况的就将其染色,于是:

bool t[101][101];

于是预处理就搞定了。

#include<iostream>
using namespace std;

int n;
bool t[101][101];
char w[101][101],d[]="yizhong";
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};


接下来你们一定会以为我会写\(DFS\)函数,然而,并非如此。
接下来就愉快的开始\(main( )\)主函数吧!

int main()
{
    cin>>n;//输入
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>w[i][j];
    for(int x=1;x<=n;x++)//核心重点,[敲显示屏]注意看!!!
        for(int y=1;y<=n;y++)//循环坐标x,y
            if(w[x][y]=='y')//如果(x,y)这个位置是y,
                for(int i=0;i<=7;i++)//就从这开始寻找八个方向是否符合情况
                {
                    bool tf=1;//定义标记
                    int tx,ty;

接下来是重中之重,[敲显示屏]注意:

                    for(int j=1;j<=6;j++)//寻找到第几个字符
                    {
                        tx=x+dx[i]*j;//下一个位置的x坐标,乘j表示往该方向寻找到第j个字符,例如:寻找到"yizhong"中的'z',就是tx=x+dx[i]*2,如果是向左上方寻找,则是寻找相对于当前位置的[(-1*2,-1*2),即(-2,-2)]
                        ty=y+dy[i]*j;//下一个位置的y坐标,同上

继续主程序:

                        if(tx<1 || tx>n || ty<1 || ty>n || w[tx][ty]!=d[j])//如果超出边界或不符合
                        {
                            tf=0;//将标记标为0
                            break;
                        }
                    }
                    if(tf)//符合情况
                        for(int j=0;j<=6;j++)
                            t[x+dx[i]*j][y+dy[i]*j]=1;//染色
                }
    for(int i=1;i<=n;i++)//输出
    {
        for(int j=1;j<=n;j++)
            if(t[i][j])
                cout<<w[i][j];
            else cout<<"*";
        cout<<endl;
    }
    return 0;
}

完整代码如下:

#include<iostream>
using namespace std;

int n;
bool t[101][101];
char w[101][101],d[]="yizhong";
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>w[i][j];
    for(int x=1;x<=n;x++)
        for(int y=1;y<=n;y++)
            if(w[x][y]=='y')
                for(int i=0;i<=7;i++)
                {
                    bool tf=1;
                    int tx,ty;
                    for(int j=1;j<=6;j++)
                    {
                        tx=x+dx[i]*j;
                        ty=y+dy[i]*j;
                        if(tx<1 || tx>n || ty<1 || ty>n || w[tx][ty]!=d[j])
                        {
                            tf=0;
                            break;
                        }
                    }
                    if(tf)
                        for(int j=0;j<=6;j++)
                            t[x+dx[i]*j][y+dy[i]*j]=1;
                }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            if(t[i][j])
                cout<<w[i][j];
            else cout<<"*";
        cout<<endl;
    }
    return 0;
}

错误经历

贴几个得部分分的代码:
40分:

#include<iostream>
using namespace std;

int n;
bool t[101][101];
char w[101][101],d[]="yizhong";
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

bool dfs(int x,int y,int p,int s)
{
    if(w[x][y]==d[s])
    {
        t[x][y]=1;
        if(s==6)
            return 1;
        else return dfs(x+dir[p][0],y+dir[p][1],p,s+1);
    }
    return 0;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>w[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(w[i][j]=='y')
                for(int k=0;k<=7;k++)
                {
                    int tx=i+dir[k][0];
                    int ty=j+dir[k][1];
                    if(tx>0&&tx<=n&&ty>0&&ty<=n)
                        if(dfs(tx,ty,k,1))
                            t[i][j]=1;
                }
        }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(t[i][j])
                cout<<w[i][j];
            else cout<<"*";
        }
        cout<<endl;
    }
    return 0;
}

80分:
```cpp

include

using namespace std;

int n;
bool t[101][101];
char w[101][101],d[]="yizhong";
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};

bool dfs(int x,int y,int p,int s)
{
if(w[x][y]==d[s])
{

    if(s==6)
    {
        t[x][y]=1;
        return 1;
    }

    else if(!t[x][y])
    {
        t[x][y]=1;
        if(!dfs(x+dir[p][0],y+dir[p][1],p,s+1))
        {
            t[x][y]=0;
            return 0;
        }
        else return 1;
    }
}
return 0;

}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>w[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(w[i][j]==‘y‘)
for(int k=0;k<=7;k++)
{
int tx=i+dir[k][0];
int ty=j+dir[k][1];
if(tx>0&&tx<=n&&ty>0&&ty<=n)
{
if(dfs(tx,ty,k,1))
t[i][j]=1;
}

            }
    }
for(int i=1;i<=n;i++)
{
    for(int j=1;j<=n;j++)
    {
        if(t[i][j])
            cout<<w[i][j];
        else cout<<"*";
    }
    cout<<endl;
}
return 0;

}```
题解到此为止,谢谢[鞠躬]!

原文地址:https://www.cnblogs.com/clear-skies/p/12255275.html

时间: 2024-10-10 13:07:50

【单词方阵】蒟蒻题解的相关文章

【铺地毯】蒟蒻题解

原题:传送门 本蒟蒻的题解,让大神们见笑了! 从上图,大家可以发现一点:后铺的地毯要比先铺的位置要更靠上,这点很重要. \(OK\),开始进入代码讲解. #include<iostream> using namespace std; int a[10001],b[10001],g[10001],k[10001],n,i,j,d,x,y; int main() { cin>>n; for(d=1;d<=n;d++) cin>>a[d]>>b[d]>

dp专场的蒟蒻题解

前言:一直想练练dp,正好衣神弄了个训练赛..上次看cgold大佬的题解心血来潮所以自己试着写了第一次题解..可惜本蒟蒻的能力太差有两道题做不太出,只好搬运学习其它大佬的题解了.. a题 https://vjudge.net/contest/355951#problem/A 这题做题的过程十分痛苦 我又双叒叕看错题意了.. 以为是必须在对角线上 其实是随便n*n的都行.. 大概思路是从一个角开始更新,统计左边和上边相同的长度 #include <iostream> #include <c

【跳马问题】蒟蒻题解

原题:传送门 上来先看(鬼畜的题目背景)题目描述.一看就是一个二维的深搜. 有芥末一条马,只会往右跳(话说它左腿系不系瘸了)日字形. 再一看数据范围,n,m<=18.等等,半棋盘不是只有4行6列吗?算了,跟\(OI\)讲什么道理啊. 好了,闲话完毕,步入正题. #include<iostream> using namespace std; 为了用坐标模拟马向右跳的动作,就要写一个坐标变化表. int dx[4]={2,-2,1,-1},dy[4]={1,1,2,2};//模拟坐标x,y的

USACO 简易题解(蒟蒻的题解)

蒟蒻难得可以去比赛,GDOI也快到了,还是认真刷题(不会告诉你之前都在颓废),KPM 神犇既然都推荐刷USACO, 辣就刷刷. 现在蒟蒻还没刷完,太蒟刷得太慢,so 写了的搞个简易题解(没代码,反正NOCOW一堆) x_y_z(表示 Section x.y 的第z题) 1_1_1 这个..... ASCII码搞一搞就好了吧... 1_1_2 直接模拟,注意均分后剩下的钱还是他的 1_1_3 日期的题最难受了,直接模拟往下推就好了 1_1_4 枚举断开的位置,然后爆枚左右,注意处理 w 如果左右第

noip2013Day2T3-华容道【一个蒟蒻的详细题解】

描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间. 小 B 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的: 在一个 n*m 棋盘上有 n*m 个格子,其中有且只有一个格子是空白的,其余 n*m-1个格子上每个格子上有一个棋子,每个棋子的大小都是 1*1 的: 有些棋子是固定的,有些棋子则是可以移动的: 任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白

蒟蒻ACMer回忆录 &#183; 一段弱校ACM的奋斗史

三年半的ACM生涯终于迎来了终点,退役之时,感慨万分,故写此文以纪念逝去的时光,那些为ACM拼搏的日子,那段弱校ACM的奋斗史. 三年半的ACM生涯,窝见证了CUMT从打铁到铜牌的突破,又见证了从铜牌到银牌的突破:见证了集训队员从3人发展到10余人,又见证了ACM实验室的落实. 三年半的ACM生涯,窝经历了太多,有Accepted时的欢笑,有Wrong Answer时的沮丧,有Time Limit Exceeded时的无奈,有Runtime Error时的尴尬,有打铁的失落,有拿牌的惊喜. 13

bzoj 4636: 蒟蒻的数列

4636: 蒟蒻的数列 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k小的数改为k,他想知 道N次操作后数列中所有元素的和.他还要玩其他游戏,所以这个问题留给你解决. Input 第一行一个整数N,然后有N行,每行三个正整数a.b.k. N<=40000 , a.b.k<=10^9 Output 一个数,数列中所有元素的和 Sample Input 4 2 5

P1101 单词方阵【洛谷】

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

BZOJ3786 星系探索 蒟蒻出题人给跪

本蒟蒻闲得蛋疼于是在BZOJ上加了一道水题,果然被瞬间水过... 只能说本蒟蒻实在是太弱了. Q:你为什么要写这篇博客? A:我只是为了水经验233.... 正常向的数据.题解.标程请自行传送下面的云盘... http://pan.baidu.com/s/1qWsMHM8 吐槽: 为什么本地不开O2 10s在OJ上开O2 还需要20+s啊!!!我本来不想卡常数好不好. 因为这个原因用数组实现数据结构被卡的请见谅...现在是40s应该卡不掉了. 另外如果发现自己被卡掉请重交一次.原因不解释. 为什