CCF_I’m stuck!_bfs

题目链接:

  http://115.28.138.223:81/view.page?opid=5

思路:

  一次bfs从起点开始找到起点能到达的点,一次bfs从终点开始找到能到终点的点,最后输出答案即可。

  刚开始写的时候,考虑找起点能到达的点的时候,用了dfs,提交只有20分,仔细想了一下,会存在无限循环的情况。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;

struct point{
    int x,y;
}start,stop;

char a[55][55];
int r,c,cango[55][55],canfrom[55][55],dir[][2] = {{-1,0},{1,0},{0,-1},{0,1}};

void bfs1(point start)
{
    queue<point> q;
    q.push(start);
    while(!q.empty())
    {
        int x = q.front().x,y = q.front().y;
        q.pop();
        if(x<0 || x>=r || y<0 || y>=c || a[x][y]==‘#‘ || cango[x][y])   continue;
        cango[x][y] = 1;
        if(a[x][y]==‘S‘ || a[x][y]==‘T‘ || a[x][y]==‘+‘)
        {
            for(int i = 0;i < 4;i++)
            {
                point temp;
                temp.x = x+dir[i][0];
                temp.y = y+dir[i][1];
                q.push(temp);
            }
        }
        else if(a[x][y] == ‘-‘)
        {
            for(int i = 2;i < 4;i++)
            {
                point temp;
                temp.x = x+dir[i][0];
                temp.y = y+dir[i][1];
                q.push(temp);
            }
        }
        else if(a[x][y] == ‘|‘)
        {
            for(int i = 0;i < 2;i++)
            {
                point temp;
                temp.x = x+dir[i][0];
                temp.y = y+dir[i][1];
                q.push(temp);
            }
        }
        else
        {
            point temp;
            temp.x = x+dir[1][0];
            temp.y = y+dir[1][1];
            q.push(temp);
        }
    }
}

void bfs2(point stop)
{
    queue<point> q;
    q.push(stop);
    while(!q.empty())
    {
        int x= q.front().x,y = q.front().y;
        q.pop();
        canfrom[x][y] = 1;
        for(int i = 0;i < 4;i++)
        {

            int xx = x+dir[i][0],yy = y+dir[i][1];
            if(xx<0 || xx>=r || yy<0 || yy>=c || canfrom[xx][yy])  continue;
            if(a[xx][yy]==‘S‘ || a[xx][yy]==‘T‘ || a[xx][yy]==‘+‘ || i==0&&a[xx][yy]==‘.‘ || i<=1&&a[xx][yy]==‘|‘ || i>=2&&a[xx][yy]==‘-‘)
            {
                point temp;
                temp.x = xx;
                temp.y = yy;
                q.push(temp);
            }
        }
    }
}
int main()
{
    scanf("%d%d",&r,&c);
    getchar();
    for(int i = 0;i < r;i++)   gets(a[i]);
    for(int i = 0;i < r;i++)
    {
        for(int j = 0;j < c;j++)
        {
            if(a[i][j] == ‘S‘)  start.x = i,start.y = j;
            else if(a[i][j] == ‘T‘) stop.x = i,stop.y = j;
        }
    }
    bfs1(start);

    if(!cango[stop.x][stop.y])
    {
        printf("I‘m stuck!\n");
        return 0;
    }
    bfs2(stop);
    int num = 0;
    for(int i = 0;i < r;i++)
    {
        for(int j = 0;j < c;j++)
        {
            if(cango[i][j] && !canfrom[i][j])   num++;
        }
    }
    printf("%d\n",num);

}
时间: 2024-12-21 06:43:00

CCF_I’m stuck!_bfs的相关文章

CCF-I&#39;m stuck!(BFS)

I'm stuck! 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此方格: '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格: '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格: '|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格

CCF 201312-5 I’m stuck! (暴力,BFS)

问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此方格: '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格: '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格: '|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格: '.': 当玩家到

Windows 7 fails to go into safe mode. Stuck at classpnp.sys

Thailand的同事笔记本进不了OS,画面上只有一个指针形鼠标,连safe mode也进不了,在加载了\windows\system32\drivers\classpnp.sys后停留在同样的画面. 首先是觉得系统文件有关,检查下硬盘是否不良,用HDtune查看: 有行警告. 然后在网上搜索了一圈,发现一个记录了同样问题的Blog文章: http://www.laifuying.com/archives/412 作者的结论也是硬盘问题,同样的,对于搜索到若干办法,对于我也是没有生效. 就是以为

ccf-I’m stuck!

给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此方格: '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格: '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格: '|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格: '.': 当玩家到达这一方格

【ACM】CCF I’m stuck! BFS

过两天准备去考ccf了..这个信息获得的有点晚,提前熟悉一下做做模拟题,但是好像起步晚了些..不碍事不碍事,还有一天好好准备,练两道题,觉得300分还是可以过的! 就这这个题也写点考试的注意事项: 首先要注意时间,考试全程4个小时,按照估算大概1-1.5小时可以做完前面3题,然后开始啃后面的大题.一般来说,大题是一题搜索一题动态规划,一个小时一题的预估. 第二,可以携带纸质资料,平时看的最熟的算法书带上,做题目时还是尽量自己思考,需要参考再看,不要上来就狂翻书. 第三,注意节奏,一般前三题可以依

ThreadPool has stuck threads

weblogic 10后台出现警告,原因:ThreadPool has stuck threads 在WEBLOGIC中如果一个线程执行时间超过了Stuck Thread Max Time规定的时间, WEBLOGIC会把它认为是STUCK线程,并记录在日志中. 我们也可以通过'Dump Thread Stacks' 来捕获STUCK状态的进程. Home > Summary of Servers > AdminServer>Monitoring>Performance>'D

I’m stuck!

I’m stuck! 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此方格: '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格: '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格: '|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格

CCF模拟 I’m stuck!

I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此方格: '+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格: '-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格: '|': 当玩家到达这一方格后,下一

weblogic stuck实验2014-11-14

     以往对weblogic stuck认识是: 1.会造成系统整体慢. 2.在weblogic console中线程监控中会有显示. 3.weblogic使用队列处理线程,隔一段时间会扫描线程队列,默认超过600s还没有结束就在日志告警(stuck),console上服务会有告警. 今天要验证的问题:stuck线程如果一直在运行,如果stuck太久会自动被kill吗?扫描stuck进程会不会在每个扫描周期内都报stuck. 实验环境:jdk1.6 + weblogic10 + oracle