zoukankan      html  css  js  c++  java
  • 简单版贪吃蛇(广搜+保存路径)(广搜保存路径 超时)

    /*
    http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3128

    心得技巧:
    此题用数组模拟对列 因为这样出对后队列里面的数据仍然保存着便于后来查找父节点
    若是用stl的模板出队后队列的数据都删除了;不容易查找父节点;

    */

    include<stdlib.h>

    include<stdio.h>

    include<string.h>

    include

    using namespace std;
    char map1[4]= {'E','S','W','N'};//映射方向
    char miGong[105][105];
    int vis[105][105];
    int dir[4][2]= {0,1,1,0,0,-1,-1,0};
    int m,n;
    struct note
    {
    int x;
    int y;
    int faX;//记录方向
    int fu;//记录父节点
    } q[105*105];
    bool bfs(int sx,int sy,int ex,int ey,int &bN)
    {
    int head=1;
    int tail=1;
    q[tail].x=sx;
    q[tail].y=sy;
    tail++;
    vis[sx][sy]=1;
    while(head<tail)
    {
    if(q[head].xex&&q[head].yey)
    {
    bN=head;
    return true;
    }
    for(int i=0; i<4; i++)
    {
    int tx=q[head].x+dir[i][0];
    int ty=q[head].y+dir[i][1];
    if(tx<0||ty<0||tx>=m||ty>=n)
    continue;
    if(miGong[tx][ty]!='#'&&vis[tx][ty]0)
    {
    vis[tx][ty]=1;
    q[tail].x=tx;
    q[tail].y=ty;
    q[tail].fu=head;//保存父节点
    q[tail].faX=i;//保存方向
    tail++;
    }
    }
    head++;
    }
    return false;
    }
    void out(int x)
    {
    if(x
    1)//第一个节点 即是入口
    return;//退回上一步调用函数的的位置
    out(q[x].fu);
    printf("%c",map1[q[x].faX]);//输出方向
    }
    int main()

    {
    while(~scanf("%d%d",&m,&n))
    {
    memset(miGong,'#',sizeof(miGong));
    memset(vis,0,sizeof(vis));
    int sx,sy,ex,ey;
    for(int i=0; i<m; i++)
    for(int j=0; j<n; j++)
    {
    scanf(" %c",&miGong[i][j]);
    if(miGong[i][j]'S')
    {
    sx=i;
    sy=j;
    }
    if(miGong[i][j]
    'E')
    {
    ex=i;
    ey=j;
    }
    }
    int bN;
    if( bfs(sx,sy,ex,ey,bN))
    {
    out(bN);
    printf(" ");
    }
    else printf("Can't eat it! ");
    }
    return 0;
    }

    /*
    5 5
    .....
    .....

    .#

    ES...

    5 5
    ....S
    .....

    .#

    E....

    */

    /*

    深搜

    */

    include<stdlib.h>

    include<stdio.h>

    include<string.h>

    include

    using namespace std;
    char map1[4]= {'E','S','W','N'};
    char miGong[105][105];
    int vis[105][105];
    int dir[4][2]= {0,1,1,0,0,-1,-1,0};
    int m,n,cur=0,min1=999999;
    int sx,sy,ex,ey;
    int a[105105];
    int b[105
    105],k,k1;
    void dfs(int x,int y,int s)
    {
    if(xex&&yey)
    {
    cur=1;
    if(s<min1)
    {
    min1=s;
    for(int i=0; i<k; i++)//把最优的路径保存下来
    b[i]=a[i];
    k1=k;
    k=0;
    }
    return ;
    }
    for(int i=0;i<4;i++)
    {
    int tx=x+dir[i][0];
    int ty=y+dir[i][1];
    if(tx<0||ty<0||tx>=m||ty>=n)
    continue;
    if(miGong[tx][ty]!='#'&&vis[tx][ty]0)
    {
    vis[tx][ty]=1;
    a[k++]=i;
    dfs(tx,ty,s+1);
    k--;//每退回一次 出栈一次
    vis[tx][ty]=0;
    }
    }
    }
    int main()
    {
    while(~scanf("%d%d",&m,&n))
    {
    memset(miGong,'#',sizeof(miGong));
    memset(vis,0,sizeof(vis));
    min1=9999;
    k=k1=0;
    for(int i=0; i<m; i++)
    for(int j=0; j<n; j++)
    {
    scanf(" %c",&miGong[i][j]);
    if(miGong[i][j]
    'S')
    {
    sx=i;
    sy=j;
    }
    if(miGong[i][j]'E')
    {
    ex=i;
    ey=j;
    }
    }
    dfs(sx,sy,0);
    if(cur
    1)
    {
    for(int i=0;i<k1;i++)
    printf("%c",map1[b[i]]);
    printf(" ");
    }
    else printf("Can't eat it! ");
    }
    return 0;
    }

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    JAVA基础 (三)反射 深入解析反射机制
    JAVA基础 (二)反射 深入解析反射机制
    JAVA注解引发的思考
    深入理解jsonp解决跨域访问
    设计模式之简单工厂模式
    设计模式之接口隔离原则
    设计模式之迪米特法则
    设计模式之依赖倒置原则
    设计模式之里氏替换原则
    设计模式之开放封闭原则
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5318991.html
Copyright © 2011-2022 走看看