【單詞方陣】蒟蒻題解

題目:傳送門


題外閒話

這道題是一個\(DFS\)(深度優先搜索 \(Depth\) \(Frist\) \(Sreach\))的題目,但是…我就是不想敲遞歸(我絕對不會告訴你我是想偷懶的),因而就有了這個程序和這篇題解……ios

題目分析

首先,這是一個二維的題目,要尋找8個方向,以下圖所示:函數

(-1,-1) (-1, 0) (-1, 1)
( 0,-1) 在這向八個方向尋找 ( 0,1)
(1,-1) (1,0) (1,1)

因此,要預處理八個方向:spa

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

還有,這題還須要作一個染色處理,碰到符合狀況的就將其染色,因而:code

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( )\)主函數吧!ci

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;

接下來是重中之重,[敲顯示屏]注意:get

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座標,同上

繼續主程序:io

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;
}

完整代碼以下:table

#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分:class

#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;

}``` 題解到此爲止,謝謝[鞠躬]!

相關文章
相關標籤/搜索