• 炸弹人 (搜索)


    第一行数据n,m表示地图的行和列,接下来的n行m列为地图,startx,starty表示小人的起点。

    本题可以采用深搜或者广搜,因为边界全为'#',所以本题不用考虑边界问题。

    深搜代码如下:

    #include<stdio.h>
    int max,num,mx,my;
    int v[30][30];
    char s[30][30];
    int getnum(int x,int y);
    int dfs(int x,int y);
    int main(void)
    {
        int n,m,startx,starty; // n 行 m 列 
        int i,j;
        scanf("%d%d%d%d",&n,&m,&startx,&starty);
        for(i=0;i<n;i++)
        {
            getchar();
            for(j=0;j<m;j++)
            {
                scanf("%c",&s[i][j]);
            }
        }
        dfs(startx,starty);
        printf("%d %d
    ",mx,my);
        printf("%d
    ",max);
        return 0; 
    } 
    int dfs(int x,int y)
    {
        if(s[x][y]=='#'||s[x][y]=='G')
        {
            return 0;
        }
        if(v[x][y]==0&&s[x][y]=='.')
        {
            v[x][y]=1;
            num=getnum(x,y);
            if(max<num)
            {
                max=num;
                mx=x;
                my=y;
                
            }
            dfs(x+1,y);
            dfs(x-1,y);
            dfs(x,y+1);
            dfs(x,y-1);
        }
    }
    int getnum(int x,int y)
    {
        int i;
        num=0;
        for(i=x;s[i][y]!='#';i++)
        {
            if(s[i][y]=='G')
            {
                num++;
            }
        }    
        for(i=x;s[i][y]!='#';i--)
        {
            if(s[i][y]=='G')
            {
                num++;
            }
        }
        for(i=y;s[x][i]!='#';i++)
        {
            if(s[x][i]=='G')
            {
                num++;
            }
        }
        for(i=y;s[x][i]!='#';i--)
        {
            if(s[x][i]=='G')
            {
                num++;
            }
        }
        return num;
    }

    广搜代码如下:

    #include<stdio.h>
    int max,num,mx,my;
    char s[30][30];
    struct note
    {
        int x;
        int y;
        int f;
        int s;
    }; 
    int getnum(int x,int y);
    int main(void)
    {
        int v[30][30];
        struct note que[1000];
        int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
        int n,m,startx,starty,i,j,k,head,tail,tx,ty; // n 行 m 列 
        scanf("%d%d%d%d",&n,&m,&startx,&starty);
        for(i=0;i<n;i++)
        {
            getchar();
            for(j=0;j<m;j++)
            {
                scanf("%c",&s[i][j]);
            }
        }
        head=tail=1;
        que[tail].x=startx;
        que[tail].y=starty;
        que[tail].f=0;
        que[tail].s=0;
        tail++;
        v[startx][starty]=1;    
        while(head<tail)
        {
            for(k=0;k<4;k++)
            {
                tx=que[head].x+next[k][0];
                ty=que[head].y+next[k][1];
                if(s[tx][ty]=='#'||s[tx][ty]=='G')
                {
                    continue; 
                }
                if(v[tx][ty]==0&&s[tx][ty]=='.')
                {
                    num=getnum(tx,ty);
                    if(max<num)
                    {
                        max=num;
                        mx=tx;
                        my=ty;                    
                    }
                    v[tx][ty]=1;
                    que[tail].x=tx;
                    que[tail].y=ty;
                    que[tail].f=head;
                    que[tail].s=que[head].s+1;
                    tail++;
                }         
            }
            head++;    
        }    
        printf("%d %d
    ",mx,my);
        printf("%d
    ",max);
        
        return 0; 
    } 
    
    int getnum(int x,int y)
    {
        int i,j,k;
        num=0;
        for(i=x;s[i][y]!='#';i++)
        {
            if(s[i][y]=='G')
            {
                num++;
            }
        }    
        for(i=x;s[i][y]!='#';i--)
        {
            if(s[i][y]=='G')
            {
                num++;
            }
        }
        for(i=y;s[x][i]!='#';i++)
        {
            if(s[x][i]=='G')
            {
                num++;
            }
        }
        for(i=y;s[x][i]!='#';i--)
        {
            if(s[x][i]=='G')
            {
                num++;
            }
        }
        return num;
    }

     附上一组测试数据:

    13 13 3 3
    #############
    #GG.GGG#GGG.#
    ###.#G#G#G#G#
    #.......#..G#
    #G#.###.#G#G#
    #GG.GGG.#.GG#
    #G#.#G#.#.#.#
    ##G...G.....#
    #G#.#G###.#G#
    #...G#GGG.GG#
    #G#.#G#G#.#G#
    #GG.GGG#G.GG#
    #############

    答案为:

    7 11

    10

  • 相关阅读:
    至少有K个重复字符的最长字串 分治法+递归
    旋转数组
    旋转链表 指针移动
    通过删除字母匹配到字典里最长的单词
    How to fix yum after CentOS 6 went EOL
    Centos6 yum源配置(CentOS 6停止更新)
    ORACLE 12C R2 RAC 安装配置指南
    Background Processes Specific to Oracle RAC
    如何缩小 Oracle 数据库中的临时表空间
    Script To Get Tablespace Utilization In Oracle Database 12c
  • 原文地址:https://www.cnblogs.com/lbd_smile/p/4543736.html
Copyright © 2020-2023  润新知