【单词方阵】蒟蒻题解

题目:传送门


题外闲话

这道题是一个\(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分:

#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])
    {
        
        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;
}```
题解到此为止,谢谢[鞠躬]!
posted @ 2020-02-03 13:04  晴空刹那  阅读(162)  评论(0)    收藏  举报