ccf-I’m stuck!
给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:
'#': 任何时候玩家都不能移动到此方格;
'+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
'-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;
'|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;
'.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;
'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。
此外,玩家不能移动出地图。
请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家不可以从此方格移动到目标位置。
输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。
5 5
--+-+
..|#.
..|##
S-+-T
####.
如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:
--+-+
..|#X
..|##
S-+-T
####X
- #include <iostream>
- #include <algorithm>
- #include <string.h>
- #include <cmath>
- #include <stdio.h>
- #include <queue>
- #define maxn 60
- char mmap[maxn][maxn];
- int vis[maxn][maxn];
- int vis1[maxn][maxn];
- int dy[] = {, , -, };
- int dx[] = {, -, , };
- int n, m;
- int num[maxn][maxn][maxn][maxn];
- using namespace std;
- struct Node
- {
- int x;
- int y;
- Node() {}
- Node(int _x, int _y) {
- x = _x;
- y = _y;
- }
- } node[maxn];
- Node st, ed;
- int check(Node a)
- {
- if(a.x >= && a.x < n && a.y >= && a.y < m && mmap[a.x][a.y] != '#') {
- return ;
- }
- return ;
- }
- int get(char c, int& u, int& v)
- {
- if(c == '-')
- {
- u = ;
- v = ;
- }
- else if(c == '|')
- {
- u = ;
- v = ;
- }
- else if(c == '.')
- {
- u = ;
- v = ;
- }
- else
- {
- u = ;
- v = ;
- }
- }
- queue<Node>que;
- int bfs()
- {
- while(!que.empty()) {
- que.pop();
- }
- que.push(st);
- vis[st.x][st.y] = ;
- Node tmp, now;
- while(!que.empty())
- {
- tmp = que.front();
- que.pop();
- int u, v;
- get(mmap[tmp.x][tmp.y], u, v);
- for(int i = u; i < v; i++)
- {
- now.x = tmp.x + dx[i];
- now.y = tmp.y + dy[i];
- if(check(now))
- {
- num[tmp.x][tmp.y][now.x][now.y] = ;
- if(!vis[now.x][now.y]) {
- vis[now.x][now.y] = ;
- que.push(now);
- }
- }
- }
- }
- if(vis[ed.x][ed.y] == )
- {
- puts("I'm stuck!");
- return ;
- }
- que.push(ed);
- while(!que.empty())
- {
- tmp = que.front();
- que.pop();
- for(int i = ; i < ; i++)
- {
- now.x = tmp.x + dx[i];
- now.y = tmp.y + dy[i];
- if(check(now) && vis1[now.x][now.y] == && num[now.x][now.y][tmp.x][tmp.y])
- {
- vis1[now.x][now.y] = ;
- que.push(now);
- }
- }
- }
- int ans = ;
- for(int i = ; i < n; i++)
- {
- for(int j = ; j < m; j++)
- {
- if(vis[i][j] == && vis1[i][j] == )
- {
- ans++;
- }
- }
- }
- printf("%d\n", ans);
- return ;
- }
- int main()
- {
- scanf("%d %d", &n, &m);
- memset(vis, , sizeof(vis));
- memset(vis1, , sizeof(vis1));
- memset(num, , sizeof(num));
- for(int i = ; i < n; i++)
- {
- scanf("%s", mmap[i]);
- for(int j = ; j < m; j++)
- {
- if(mmap[i][j] == 'S')
- {
- st.x = i;
- st.y = j;
- }
- if(mmap[i][j] == 'T')
- {
- ed.x = i;
- ed.y = j;
- }
- }
- }
- bfs();
- return ;
- }
ccf-I’m stuck!的更多相关文章
- CCF I'm Stuck!
问题描述 试题编号: 201312-5 试题名称: I'm stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', ...
- CCF 201312-5 I’m stuck! (暴力,BFS)
问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此方格 ...
- CCF系列之I’m stuck!(201312-5)
试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', ...
- CCF模拟 I’m stuck!
I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七 ...
- CCF计算机职业资格认证考试题解
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF计算机职业资格认证考试题解 CCF计算机软件能力认证(简称CCF CSP认证)是CCF计算机职业资格认证系 ...
- CCF认证历年试题
CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201709-1 打酱油(100分) CCF201703-1 分蛋糕(100分) CCF2 ...
- 【刷题笔记】I'm stuck! (迷宫)-----java方案
题目描述 : 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: '#': 任何时候玩家都不能移动到此 ...
- CCF考试
第八次CCF考试记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四题的代码 第 ...
- CCF 模拟E DFS深搜
http://115.28.138.223:81/view.page?opid=5 这道题问的很怪. 起点DFS,每一个点还要DFS一次,统计不能到终点的个数 数据量不大这样做也能AC #includ ...
- CCF关于NOIP2014复赛报名的通知
CCF关于NOIP2014复赛报名的通知 CCF NOIP2014复赛全部实行网上注册.报名.未通过网上报名的选手将不具备参赛和申诉资格. 系统注册须知: NOIP2014复赛注册时间:2014年 ...
随机推荐
- int,long,long long类型的范围
[内置类型] int -2147483648-2147483647 //现在编译器的int型是32位的,以前为16位的范围是-32768~32767 unsigned int 0-4 ...
- 利用java中的BigInteger实现进制转换
[原创] java中的进制BigInteger十分的强大,而且好用,他可以表示任意大的整数,同时还可以进行进制转换,十分的方便, 代码示例: package com.jiajia.demo_1; im ...
- Jquery 跨域请求JSON数据问题
制作网站时,我们有时候为了方便快捷会调用别人写好的API接口,或者是调用一些免费的API接口获得JSON数据.比如天气,农历,网站备案信息查询等. 但是,这些API接口都是别人自己服务器上的,我们要调 ...
- js定时器实现图片轮播
效果展示如下: setInterval(moverleft,3000);定时器设置为3秒,而且实现图片下方的小圆点序号跟图片对应,点击小圆点也能切换图片. 代码如下: <!DOCTYPE htm ...
- C - 最长公共子序列
C - 最长公共子序列 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem De ...
- Bjarne Stroustrup 语录1
1. 请谈谈C++书. 没有,也不可能有一本书对于所有人来说都是最好的.不过对于那些真正的程序员来说,如果他喜欢从“经典风格”的书中间学习一些新的概念和技术,我推荐我的The C++ Program ...
- [洛谷P2590][ZJOI2008]树的统计
题目大意:一棵树,支持三个操作, $CHANGE\;u\;t:$ 把结点$u$的权值改为$t$ $QMAX\;u\;v:$ 询问从点$u$到点$v$的路径上的节点的最大权值 $QSUM\;u\;v:$ ...
- 01、BUCK电路的参数计算
案例:设计一个Buck电路,满足如下性能指标要求:一.性能指标要求 1.输入电压 2.输出电压 3.输出电压纹波 4.电流纹波 5.开关频率 二.需要计算的参数 三.BUCK电路拓扑 ...
- SCU3037 Painting the Balls
Description Petya puts the \(N\) white balls in a line and now he wants to paint some of them in bla ...
- bzoj2724: [Violet 6]蒲公英 分块 区间众数 论algorithm与vector的正确打开方式
这个,要处理各个数的话得先离散,我用的桶. 我们先把每个块里的和每个块区间的众数找出来,那么在查询的时候,可能成为[l,r]区间的众数的数只有中间区间的众数和两边的数. 证明:若不是这里的数连区间的众 ...