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年 ...
随机推荐
- centos tomcat开机自启
在 /etc/rc.local 下 输入tomcat bin目录下的startup.sh /usr/tomcat8/bin/startup.sh 即可
- unity 归纳
1.获取控件四个角在屏幕上的坐标 Vector3[] corners = new Vector3[]; gameObject.GetComponent<RectTransform>().G ...
- android仿QQ的SlideMenu
这其实很简单就可以实现,只需要自定义一个View继承自HorizontalScrollView 1,新建一个项目,再新建一个MySlideMenu继承HorizontalScrollView publ ...
- sc"
2.11 题目:二叉搜索树中的最近公共祖先 2.12 设计思路 if 树中不存在 u 或 v 错误 结束程序 定义 p 指向根节点 while true do: if p->key大于 u 和 ...
- Ext.net中TreePanel动态生成
这个问题可以参考官网例子:http://examples2.ext.net/#/TreePanel/Basic/Built_in_CodeBehind/ 贴一段本人程序中用到的动态生成核心代码: Ex ...
- LevelDB速记
LevelDb的基本结构如下: 由六大部分组成: 一.MemTable,用户写入和读取的直接对象, 二.Immutable MemTable,用户状态写入的对象写满的MemTable之后会转为Immu ...
- [Java文件操作] 将素数输出到文件
[要求]编写程序求出10万以内的所有素数,并将这些素数输出到一个文本文件中,每行文本只包含一个素数数据. import java.util.*; import java.io.*; public cl ...
- javascript 随机数区间
生成[0,max]之间的随机数 parseInt(Math.random()*(max+1),10);Math.floor(Math.random()*(max+1)); 生成[1,max]之间的随机 ...
- taotao用户注册前台页面
注册页面效果: 注册jsp: <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- codeforces902B. Coloring a Tree
B. Coloring a Tree 题目链接: https://codeforces.com/contest/902/problem/B 题意:给你一颗树,原先是没有颜色的,需要你给树填色成指定的样 ...