zoukankan      html  css  js  c++  java
  • 炸弹人 (搜索)

    第一行数据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

  • 相关阅读:
    URAL——DFS找规律——Nudnik Photographer
    URAL1353——DP——Milliard Vasya's Function
    URAL1203——DPor贪心——Scientific Conference
    递推DP HDOJ 5389 Zero Escape
    区间DP UVA 1351 String Compression
    树形DP UVA 1292 Strategic game
    Manacher HDOJ 5371 Hotaru's problem
    同余模定理 HDOJ 5373 The shortest problem
    递推DP HDOJ 5375 Gray code
    最大子序列和 HDOJ 1003 Max Sum
  • 原文地址:https://www.cnblogs.com/lbd_smile/p/4543736.html
Copyright © 2011-2022 走看看