zoukankan      html  css  js  c++  java
  • HDU-1180-诡异的楼梯

    题目链接

    http://acm.hdu.edu.cn/showproblem.php?pid=1180

    这个题目本身不是很难,就是分情况看‘|’和‘-’讨论方向而已,不过题目的意思要理解正确

    即在碰到楼梯时已走了t步那么踩楼梯就应该是t+1步如果是‘|’那么if((t+1)%2==0)  则还是‘|’;否则是‘-’;

    我在设置‘|’。‘-’时错了,害的我搞了很久才发现,做题应该先在草稿子上写好框架和主要程序,这样能减少程序的逻辑错误。

    敲代码前多想想,多想几种思路,从中选最优的一种思路来敲。

    代码:

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<queue>
    #include<algorithm>
    using namespace std;

    int ex,ey,n,m;
    int dx[4]= {1,0,-1,0};
    int dy[4]= {0,-1,0,1};
    char map[30][30];
    int vis[30][30];

    struct node
    {
    int x,y,t;
    };

    queue<node> q;

    void bfs(int stx,int sty)
    {
    memset(vis,0,sizeof(vis));
    vis[stx][sty]=1;
    node s,e;
    while(q.size())
    q.pop();
    s.x=stx;
    s.y=sty;
    s.t=0;
    q.push(s);
    while(q.size())
    {
    s=q.front();
    q.pop();
    if(map[s.x][s.y]=='T')
    {
    printf("%d ",s.t);
    break;
    }
    int i;
    for(i=0; i<4; i++)
    {
    e.x=s.x+dx[i];
    e.y=s.y+dy[i];
    if(e.x>=0&&e.x<n&&e.y>=0&&e.y<m&&map[e.x][e.y]!='*')
    {
    int flag=0;
    if(map[e.x][e.y]=='|')
    {
    if(s.t%2==0)
    flag=1;
    else
    flag=2;
    }
    if(map[e.x][e.y]=='-')
    {
    if(s.t%2==0)
    flag=2;
    else
    flag=1;
    }
    if(flag==1)
    {
    if(i%2==1)
    {
    e.t=s.t+1;
    e.x=s.x;
    e.y=s.y;
    q.push(e);
    }
    else
    {
    e.x=e.x+dx[i];
    e.y=e.y+dy[i];
    if(e.x>=0&&e.x<n&&e.y>=0&&e.y<m&&map[e.x][e.y]!='*'&&vis[e.x][e.y]==0)
    {
    e.t=s.t+1;
    q.push(e);
    vis[e.x][e.y]=1;
    vis[e.x-2*dx[i]][e.y]=1;
    }
    }
    }
    else if(flag==2)
    {
    if(i%2==0)
    {
    e.t=s.t+1;
    e.x=s.x;
    e.y=s.y;
    q.push(e);
    }
    else
    {
    e.x=e.x+dx[i];
    e.y=e.y+dy[i];
    if(e.x>=0&&e.x<n&&e.y>=0&&e.y<m&&map[e.x][e.y]!='*'&&vis[e.x][e.y]==0)
    {
    e.t=s.t+1;
    q.push(e);
    vis[e.x][e.y]=1;
    vis[e.x][e.y-2*dy[i]]=1;
    }
    }
    }
    else
    {
    if(vis[e.x][e.y]==0)
    {
    e.t=s.t+1;
    q.push(e);
    vis[e.x][e.y]=1;
    }
    }
    }
    }
    }
    }

    int main(void)
    {
    int i,j,stx,sty;
    while(scanf("%d%d",&n,&m)==2)
    {
    getchar();
    for(i=0; i<n; i++)
    {
    for(j=0; j<m; j++)
    {
    scanf("%c",&map[i][j]);
    if(map[i][j]=='S')
    {
    stx=i;
    sty=j;
    }
    }
    getchar();
    }
    bfs(stx,sty);
    }
    return 0;
    }

  • 相关阅读:
    Android Studio使用
    VS.NET发送会议邮件程序原码
    C#中渐变色的代码实例,用于自绘菜单
    VS.NET获取某年某月的天数
    AJAX原理简要说明及实例
    ASP.NET下增加定时器功能
    VS.NET发送普通邮件原码
    保存xml到server实例
    VS.NET通过OUTLOOK发邮件
    利用IE打印的一点实例代码
  • 原文地址:https://www.cnblogs.com/liudehao/p/4053980.html
Copyright © 2011-2022 走看看