2022.1.13-1.14

洛谷:单词方阵
和前天的思路是一样的,不过没再用数组将需要对比的字母装起来了;
题解:
【1】首先输入这个单词矩阵(一定要注意字符数组的特殊性)//前面卡了挺久,有这个原因
【2】找到单词首字母’y’,从它开始搜索
【3】分八个方向,题中说一个单词只会在一个方向上(所以把方向也当作了一个参数)
【4】如果搜索时,该方向上的字母和单词相同位置的字母是相同的,且下一个字母也满足这样的条件(这里可以用返回值,来判断),就可以将这个位置标记,这一步旨在,将上一个字母和下一个字母联系起来
【5】如果一次性找到了单词的最后位置,那么就代表这里有一个单词(被标记的单词),所以dfs();函数中还需要传一个参数,代表比较到第几位了
[6]如果一直能比到最后一位就代表是这个单词

#include
int n;
char str[101][101];
int way[101][101];
int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,1}};
char word[]="yizhong";
void print()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(way[i][j]!=1)
            {
                str[i][j]='*';
            }
            printf("%c",str[i][j]);
        }
        printf("\n");
    }
    return;
}
int dfs(int x,int y,int d,int step)
{
    //最后一个单词
    if(step==6)
    {
        way[x][y]=1;
        return 1;
    }
    //没到最后一个单词(需要满足条件)
    int nx=x+dir[d][0];
    int ny=y+dir[d][1];
    //条件:
    //不超过边界&&该位置的字母与相对应的单词位置相同的字母相同&&下一个字母也满足上一个条件
    if(nx>=0&&ny>=0&&nx<n&&ny<n&&str[nx][ny]==word[step+1]&&dfs(nx,ny,d,step+1)==1)
    {
        way[nx][ny]=1;
        return 1;
    }
    return 0;
}
int main()
{
    scanf("%d",&n);
    //一定要注意字符矩阵的输入,每次到这里就错
    for(int i=0;i<n;i++)
    {
        scanf("%s",str[i]);
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(str[i][j]=='y')
            {
                for(int d=0;d<8;d++)
                {
                    if(dfs(i,j,d,0)==1)
                        way[i][j]=1;
                }
            }
        }
    }
    print();
    return 0;
}

洛谷:填涂颜色
(和水坑有点关系)
题解:
只要把1外面的0改变一下,等将包围圈里面的0改为2了,再将外面被改变的0改回去就行了
(为了将最外圈的0都可以被搜到,我在最外圈的基础上还加了一个全是0的圈,这样就将整个地图连起来了)

#include
int str[35][35]={0};
int n;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void print()
{
    //printf("\n");
    for(int i=1;i<n+1;i++)
    {
        for(int j=1;j<n+1;j++)
        {
            if(str[i][j]==0)
            {
                str[i][j]=2;
            }
            if(str[i][j]==7)
            {
                str[i][j]=0;
            }
            printf("%d ",str[i][j]);
        }
        printf("\n");
    }
    return;
}
void dfs(int x,int y)
{
    for(int i=0;i<4;i++)
    {
        int nx=x+dir[i][0];
        int ny=y+dir[i][1];
        if(nx>=0&&ny>=0&&nx<=n+1&&ny<=n+1&&str[nx][ny]==0)
        {
            str[nx][ny]=7;
            dfs(nx,ny);
        }
    }
    return;
}
int main()
{
    //int cout=0;
    char c;
    scanf("%d",&n);
    //getchar();
    for(int i=1;i<n+1;i++)
    {
        for(int j=1;j<n+1;j++)
        {
            scanf("%d",&str[i][j]);
        }
    }
    dfs(0,0);
    print();
    //printf("%d\n",cout);
    return 0;
}

洛谷:马的遍历
用DFS写的超时,但还是把代码贴一下

//这个题如果用 dfs 的话只能部分AC,因为会超时
#include
int dir[8][2]={{-2,-1},{-2,1},{2,1},{2,-1},{1,-2},{1,2},{-1,2},{-1,-2}};
int n,m,x,y;
int min=1e9;
int way[405][405]={0};
int dfs(int sx,int sy,int fx,int fy,int step)
{
    if(sx==fx&&sy==fy)
    {
        //printf("#####\n");
        if(min>step)
        {
            min=step;
        }
//        printf("%d\n",min);
//        //return 1;
    }
    for(int i=0;i<8;i++)
    {
        int nx=sx+dir[i][0];
        int ny=sy+dir[i][1];
        if(nx>=1&&ny>=1&&nx<=n&&ny<=m&&way[nx][ny]==0)//&&way[nx][ny]==0)
        {
            way[nx][ny]=1;
            dfs(nx,ny,fx,fy,step+1);
            way[nx][ny]=0;
        }
    }
}
int main()
{
    int num=-1;
    scanf("%d %d %d %d",&n,&m,&x,&y);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            min=1e9;
            way[1][1]=1;
            dfs(x,y,i,j,0);
            if(min!=1e9)
            printf("%-5d",min);
            else
            printf("%-5d",num);
        }
        printf("\n");
    }
    return 0;
}

听了网课,听那个BFS的实现

你可能感兴趣的:(深度优先,算法,c语言)