CSUOJ 1259 跳跳

Description

一个每块地板标记着0~9某个数字的迷宫,其中标记1的地板不可以走,标记2~9的地板可以不花时间地跳到任意相同数字的位置,也可以和标记0的地板一样向前后左右任意方向花1个单位时间移动1的距离。给出起点和终点,求起点到终点的最短时间。

Input

每组数据第一行一个n,表示尺寸,2 <= n <= 100。

接下来n行每行n个0~9的字符,或S表示起点,E表示终点,S和E的运动规则与0相同。整个地图只有一个S和一个E。

Output

每组数据输出一个数,占一行,表示起点到终点可以花费的最短时间。

如果无法到达重点,输出"Oh No!"

Sample Input

5
0S100
00131
00300
00000
003E0
3
S12
010
10E

Sample Output

4
Oh No!

BFS的变形 需要注意的一点事遇到2-9的数字就全部push 相应数字
 1 # include <cstdio>
 2 # include <queue>
 3 # include <cstring>
 4 # define N 105
 5 using namespace std;
 6
 7 int n;
 8 char g[N][N];
 9 char vis[N][N];
10
11 struct pos{int x, y, d;};
12 queue <pos> Qst[10];
13 pos st;
14
15 //描述相邻点的相对位置
16 const int dx[] = {0, 0, 1, -1};
17 const int dy[] = {1, -1, 0, 0};
18
19 int bfs()
20 {
21     queue <pos> Q;
22     Q.push(st);
23     //访问标记
24     vis[st.x][st.y] = 1;
25     while(!Q.empty()){
26         pos cur = Q.front();
27         Q.pop();
28         for(int i = 0; i < 4; ++i){
29             pos nst;
30             //遍历该店上下左右的点
31             nst.x = cur.x + dx[i];
32             nst.y = cur.y + dy[i];
33             //判断是否还在范围内并且未访问过
34             if(1 <= nst.x && nst.x <= n && 1 <= nst.y && nst.y <= n && !vis[nst.x][nst.y]){
35                 //访问标记
36                 vis[nst.x][nst.y] = 1;
37                 char ch = g[nst.x][nst.y];
38                 //判断是否找到终点 找到返回步数
39                 if(ch == ‘E‘)
40                     return cur.d+1;
41                 //判断是否遇到阻碍 是的话跳过进入下一次循环
42                 if(ch == ‘1‘)
43                     continue;
44                 //如果是 0 步数加 1 把邻接点压入队列
45                 if(ch == ‘0‘)
46                     nst.d=cur.d+1, Q.push(nst);
47                 //如果是2-9可以“传送”的点 找到与该点数字相同点压入队列
48                 else if (‘2‘ <=ch && ch <= ‘9‘){
49                     pos nnst;
50                     while(!Qst[ch-‘0‘].empty()){
51                         nnst = Qst[ch-‘0‘].front();
52                         Qst[ch-‘0‘].pop();
53                         vis[nnst.x][nnst.y] = 1;
54                         nnst.d = cur.d + 1;
55                         Q.push(nnst);
56                     }
57                 }
58             }
59         }
60     }
61     return -1;
62 }
63
64 int main()
65 {
66     while (~scanf("%d", &n)){
67         pos tmp;
68         //将队列清空
69         for(int i = 2; i <= 9; i++)
70             while (!Qst[i].empty())
71                 Qst[i].pop();
72         for (int i = 1; i <= n; i++){
73             scanf("%s", g[i]+1);
74             memset(vis[i]+1, 0, sizeof(char)*n);
75             for(int j = 1; j <= n; j++){
76                 char ch = g[i][j];
77                 //把可跳跃位置压入队列
78                 if (‘2‘ <= ch && ch <= ‘9‘){
79                     tmp.x = i, tmp.y = j;
80                     Qst[ch-‘0‘].push(tmp);
81                 }
82                 //记录初始位置
83                 else if (ch == ‘S‘){
84                     st.x = i, st.y = j;
85                     st.d = 0;
86                 }
87             }
88         }
89         int ans = bfs();
90         if (ans == -1)
91             printf("Oh No!\n");
92         else
93             printf("%d\n", ans);
94     }
95     return 0;
96 }

CSUOJ 1259 跳跳

时间: 2024-10-01 06:30:47

CSUOJ 1259 跳跳的相关文章

跳跳 (BFS) CUS 1259

D - 跳跳 Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit Status Description 一个每块地板标记着0~9某个数字的迷宫,其中标记1的地板不可以走,标记2~9的地板可以不花时间地跳到任意相同数字的位置,也可以和标记0的地板一样向前后左右任意方向花1个单位时间移动1的距离.给出起点和终点,求起点到终点的最短时间. Input 每组数据第一行一个n,表示尺寸,2 &l

CSUOJ 1010 Water Drinking

Description The Happy Desert is full of sands. There is only a kind of animal called camel living on the Happy Desert. ‘Cause they live here, they need water here. Fortunately, they find a pond which is full of water in the east corner of the desert.

CSUOJ 1217 奇数个的那个数

Description 给定些数字,这些数中只有一个数出现了奇数次,找出这个数. Input 每组数据第一行n表示数字个数,1 <= n <= 2 ^ 18 且 n % 2 == 1. 接下来n行每行一个32位有符号整数. Output 出现奇数次那个数,每组数据对应一行. Sample Input 5 1 1 2 2 3 7 1 2 1 2 2 3 3 Sample Output 3 2 看了大神的代码 使用位运算o(╯□╰)o 1 # include <stdio.h> 2 i

Aizu 2164 CSUOJ 1436 Revenge of the Round Table

dp套一个burnside的壳子核心还是dpdp[i]表示有i个循环节时的染色方案数注意在dp的时候,不需要考虑重构的问题因为burnside会解决重构的问题dpA[i][j]表示以A开头,长度为i,结尾为j个A的合法方案数dpB[i][j]表示以B开头,长度为i,结尾为j个A的合法方案数接下来我们用dpA,dpB来计算dp[i]显然对于所有的dpB[i][1~k]都是满足dp[i]的因为它表示以B开头,以A结尾的染色方案,且结尾没有超过k个另外还有一部分就是以A开头的了假设我们在整个串的最前面

csuoj 1511: 残缺的棋盘

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1511 1511: 残缺的棋盘 时间限制: 1 Sec  内存限制: 128 MB 题目描述 输入 输入包含不超过10000 组数据.每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同. 输出 对于每组数据,输出测试点编号和最少步数. 样例输入 1 1 8 7 5 6 1 1 3 3

CSUOJ 1343

1343: Long Long Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 180  Solved: 48[Submit][Status][Web Board] Description 现在有两个单调递增序列,第一个序列有N个整数,第二个序列有M个整数,现在你可以从第一个序列中选一个数x,然后从第二个序列中选一个数y,那么有多少种情况满足x+y<=K呢? Input 输入包含多组数据.    对于每组测试数据,第一行包含两个整数N, M , K 

codevs 1259 最大正方形子矩阵 WD

1259 最大正方形子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个01矩阵中,包含有很多的正方形子矩阵,现在要求出这个01矩阵中,最大的正方形子矩阵,使得这个正方形子矩阵中的某一条对角线上的值全是1,其余的全是0. 输入描述 Input Description 第一行有两个整数n和m(1<=n,m<=1000).接下来的n行,每行有m个0或1的数字.每两个数字之间用空格隔开. 输出描述 Output Descr

并查集--CSUOJ 1601 War

并查集的经典题目: CSUOJ 1601: War Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 247  Solved: 70[Submit][Status][Web Board] Description AME decided to destroy CH’s country. In CH’ country, There are N villages, which are numbered from 1 to N. We say two vill

CSUOJ 1256 天朝的单行道

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1256 题目大意: 在另一个平行宇宙中,有一个神奇的国度名叫天朝.天朝一共有N个城市(标号分别为1, 2, …, N),M条道路,为了方便交通管制,天朝的M条道路都是单行道. 不久前天朝大选,小Q当选了天朝的总统.小Q家住在城市1,但天朝的办公地点在城市N,于是为了便于工作,小Q决定举家从城市1搬迁到城市N去居住.然而小Q惊奇的发现,现在并不存在从城市1出发到城市N路线. 但这点难题是无