CCF模拟题5-I'm stuck!

问题描述

给定一个R行C列的地图,地图的每一个方格可能是‘#‘, ‘+‘, ‘-‘, ‘|‘, ‘.‘, ‘S‘, ‘T‘七个字符中的一个,分别表示如下意思:
‘#‘: 任何时候玩家都不能移动到此方格;
‘+‘: 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非‘#‘方格移动一格;
‘-‘: 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非‘#‘方格移动一格;
‘|‘: 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非‘#‘方格移动一格;
‘.‘: 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为‘#‘,则玩家不能再移动;
‘S‘: 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非‘#‘方格移动一格;
‘T‘: 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非‘#‘方格移动一格。
此外,玩家不能移动出地图。
请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家可以从此方格移动到目标位置。

输入格式

输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个‘S‘和一个‘T‘。

输出格式

如果玩家在初始位置就已经不能到达终点了,就输出“I‘m stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。

样例输入

5 5
--+-+
..|#.
..|##
S-+-T
####.

样例输出

2

样例说明

如果把满足性质的方格在地图上用‘X‘标记出来的话,地图如下所示:
--+-+
..|#X
..|##
S-+-T
####X

给的参考答案懒得看,于是自己写了个,自己跑了下样例(明明只有一个啊喂!),还没有提交测试过。

总之,利用递归,设置了两个函数:一个是判断是否能够走到目标T,为canMove,参数为现在的坐标和之前的坐标(为防止重复搜索)。另一个是move,用来到达其他的节点(每次在move中调用canMove进行判断)。

代码比较好懂,效率......应该比较低吧。

还有要注意的就是XY值和二维数组的转换。
  1 #include <iostream>
  2
  3 using namespace std;
  4
  5 int count = 0;
  6 int r,c;
  7
  8 bool canMove(char board[][50],int x, int y,int fx,int fy){
  9     bool temp1,temp2,temp3,temp4;
 10     switch (board[y][x]){
 11         case ‘T‘:
 12             return true;
 13         case ‘+‘:
 14         case ‘S‘:
 15             if((x-1 >= 0) && (board[y][x-1]!=‘#‘) && fx!= x-1)
 16             {
 17                 temp1 = canMove(board,x-1,y,x,y);
 18                 if(temp1)
 19                     return temp1;
 20             }
 21             if((x+1 < c) && (board[y][x+1]!=‘#‘) && fx!= x+1)
 22             {
 23                 temp2 = canMove(board,x+1,y,x,y);
 24                 if(temp2)
 25                     return temp2;
 26             }
 27             if((y-1 >= 0) && (board[y-1][x]!=‘#‘) && fy!= y-1)
 28             {
 29                 temp3 = canMove(board,x,y-1,x,y);
 30                 if(temp3)
 31                     return temp3;
 32             }
 33             if((y+1 < r) && (board[y+1][x]!=‘#‘) && fy!= y+1)
 34             {
 35                 temp4 = canMove(board,x,y+1,x,y);
 36                 if(temp4)
 37                     return temp4;
 38             }
 39             break;
 40         case ‘-‘:
 41             if((x-1 >= 0) && (board[y][x-1]!=‘#‘) && fx!= x-1)
 42             {
 43                 temp1 = canMove(board,x-1,y,x,y);
 44                 if(temp1)
 45                     return temp1;
 46             }
 47             if((x+1 < c) && (board[y][x+1]!=‘#‘) && fx!= x+1)
 48             {
 49                 temp2 = canMove(board,x+1,y,x,y);
 50                 if(temp2)
 51                     return temp2;
 52             }
 53             break;
 54         case ‘|‘:
 55             if((y-1 >= 0) && (board[y-1][x]!=‘#‘) && fy!= y-1)
 56             {
 57                 temp3 = canMove(board,x,y-1,x,y);
 58                 if(temp3)
 59                     return temp3;
 60             }
 61             if((y+1 < r) && (board[y+1][x]!=‘#‘) && fy!= y+1)
 62             {
 63                 temp4 = canMove(board,x,y+1,x,y);
 64                 if(temp4)
 65                     return temp4;
 66             }
 67             break;
 68         case ‘.‘:
 69             if((y+1 < r) && (board[y+1][x]!=‘#‘) && fy!= y+1)
 70             {
 71                 temp4 = canMove(board,x,y+1,x,y);
 72                 if(temp4)
 73                     return temp4;
 74             }
 75             break;
 76         default:
 77             break;
 78     }
 79     return false;
 80 }
 81
 82 void move(char board[][50],int x, int y,int fx,int fy){
 83     if(!canMove(board,x,y,x,y)){
 84         ::count++;
 85     }
 86     switch (board[y][x]){
 87         case ‘+‘:
 88         case ‘S‘:
 89         case ‘T‘:
 90             if((x-1 >= 0) && (board[y][x-1]!=‘#‘) && fx!= x-1)
 91                 move(board,x-1,y,x,y);
 92             if((x+1 < c) && (board[y][x+1]!=‘#‘) && fx!= x+1)
 93                 move(board,x+1,y,x,y);
 94             if((y-1 >= 0) && (board[y-1][x]!=‘#‘) && fy!= y-1)
 95                 move(board,x,y-1,x,y);
 96             if((y+1 < r) && (board[y+1][x]!=‘#‘) && fy!= y+1)
 97                 move(board,x,y+1,x,y);
 98             break;
 99         case ‘-‘:
100             if((x-1 >= 0) && (board[y][x-1]!=‘#‘) && fx!= x-1)
101                 move(board,x-1,y,x,y);
102             if((x+1 < c) && (board[y][x+1]!=‘#‘) && fx!= x+1)
103                 move(board,x+1,y,x,y);
104             break;
105         case ‘|‘:
106             if((y-1 >= 0) && (board[y-1][x]!=‘#‘) && fy!= y-1)
107                 move(board,x,y-1,x,y);
108             if((y+1 < r) && (board[y+1][x]!=‘#‘) && fy!= y+1)
109                 move(board,x,y+1,x,y);
110             break;
111         case ‘.‘:
112             if((y+1 < r) && (board[y+1][x]!=‘#‘) && fy!= y+1)
113                 move(board,x,y+1,x,y);
114         default:
115             break;
116     }
117  }
118
119
120 int main() {
121     int r, c;
122     cin >> r >> c;
123     ::r = r;
124     ::c = c;
125     char board[r][50];
126     cin.getline(board[0], c + 1);
127     for (int i = 0; i < r; i++) {
128         cin.getline(board[i], c + 1);
129     }
130     int x = 0, y = 0;
131     for (int i = 0; i < r; i++)
132         for (int j = 0; j < c; j++) {
133             if (board[i][j] == ‘S‘) {
134                 x = j;
135                 y = i;
136             }
137
138         }
139     /*for(int i=0;i<r;i++){
140         for(int j=0;j<c;j++)
141             cout<<board[i][j]<<" ";
142         cout<<endl;
143     }*/
144     if (canMove(board, x, y, x, y)){
145         move(board, x, y, x, y);
146         cout <<::count<< endl;
147     }else
148         cout<<"I‘m stuck!"<<endl;
149     return 0;
150 }

CCF模拟题5-I'm stuck!

时间: 2024-10-08 22:22:50

CCF模拟题5-I'm stuck!的相关文章

ISBN号码-CCF模拟题

问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第二个分隔之后的五位数字代表该书在出版社的编号:最后一位为识别码. 识别码的计算方法如下: 首位数字乘以1加

CCF模拟题 字符串匹配

字符串匹配 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行.你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符:当选项关闭时,表示同一个字母的大写和小写看作相同的字符. 输入格式 输入的第一行包含一个字符串S,由大小写英文字母组成. 第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感. 第三行包含一个整数n,表示给出的文字的行数. 接下来n

CCF模拟题 最优配餐

最优配餐 时间限制: 1.0s 内存限制: 256.0MB 问题描述 栋栋最近开了一家餐饮连锁店,提供外卖服务.随着连锁店越来越多,怎么合理的给客户送餐成为了一个急需解决的问题. 栋栋的连锁店所在的区域可以看成是一个n×n的方格图(如下图所示),方格的格点上的位置上可能包含栋栋的分店(绿色标注)或者客户(蓝色标注),有一些格点是不能经过的(红色标注). 方格图中的线表示可以行走的道路,相邻两个格点的距离为1.栋栋要送餐必须走可以行走的道路,而且不能经过红色标注的点. 送餐的主要成本体现在路上所花

CCF模拟题 有趣的数

有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高位数字不为0. 因此,符合我们定义的最小的有趣的数是2013.除此以外,4位的有趣的数还有两个:2031和2301. 请计算恰好有n位的有趣的数的个数.由于答案可能非常大,只需要输出答案除以1000000007的余数. 输入格式 输入只有一

CCF模拟题 相反数

相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数). 输入格式 第一行包含一个正整数 N.(1 ≤ N ≤ 500). 第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同. 输出格式 只输出一个整数,即这 N 个数中包含多少对相反数. 样例输入 51 2 3 -1 -2 样例输出 2 解题:... 1 #include <bits/std

CCF模拟题 最优灌溉

最优灌溉 时间限制: 1.0s 内存限制: 256.0MB 问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需要建立一些水渠,以连接水井和麦田,雷雷也可以利用部分麦田作为“中转站”,利用水渠连接不同的麦田,这样只要一片麦田能被灌溉,则与其连接的麦田也能被灌溉. 现在雷雷知道哪些麦田之间可以建设水渠和建设每个水渠所需要的费用(注意不是所有麦田之间都可以建立水渠).请问灌溉所有麦田最少需要多少费用来修建水渠. 输入

CCF模拟题1-出现次数最多的数

试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n).相邻的数用空格分隔. 输出格式 输出这n个次数中出现次数最多的数.如果这样的数有多个,输

CCF模拟题2-ISBN号码

问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第二个分隔之后的五位数字代表该书在出版社的编号:最后一位为识别码. 识别码的计算方法如下: 首位数字乘以1加

CCF模拟题 最大的矩形

最大的矩形 时间限制: 1.0s 内存限制: 256.0MB 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi.这n个矩形构成了一个直方图.例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3. 请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行.对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10. 输入格式 第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000). 第二行包含n 个整数h1, h2