码迷,mamicode.com
首页 > 其他好文 > 详细

【ACM】CCF I’m stuck! BFS

时间:2015-09-12 00:44:55      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

过两天准备去考ccf了。。这个信息获得的有点晚,提前熟悉一下做做模拟题,但是好像起步晚了些。。不碍事不碍事,还有一天好好准备,练两道题,觉得300分还是可以过的!

就这这个题也写点考试的注意事项:
首先要注意时间,考试全程4个小时,按照估算大概1-1.5小时可以做完前面3题,然后开始啃后面的大题。一般来说,大题是一题搜索一题动态规划,一个小时一题的预估。
第二,可以携带纸质资料,平时看的最熟的算法书带上,做题目时还是尽量自己思考,需要参考再看,不要上来就狂翻书。
第三,注意节奏,一般前三题可以依照开始的冲劲做完,但是后面就要调节一下。
第四,思路重要,拿到题目先定思路,然后做的过程中注意细节(如不用getchar,横坐标和纵坐标),测试用例一般为:一般--》极限值--》不对称--》多用例痕迹,不过一定多看题目要求。
 
问题描述

  给定一个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
 
这道题考察的可以看出来是搜索,不过里面加了不少东西,考虑起来不费劲,写起来就比较麻烦。
思路是这样的,首先看看从S点出发可以走到哪,然后看看哪些点可以到达T点(重写规则),比较求差即可。
我这里的实现比较麻烦,BFS BFS2实现两个模块。但是对我来说程序贵在思路清晰,不追求特别短的。
提交的时候R C写反了只拿了60分,改回来就不能提交了= =
 
 
代码如下:

1
#include <stdio.h> 2 #include <queue> 3 #include <string.h> 4 #define LOCAL 5 using namespace std; 6 struct S { 7 int x,y; 8 }; 9 char maze[52][52]; 10 int mark[52][52]; 11 int mark2[52][52]; 12 int R,C; 13 queue<S> Q,Q2; 14 S start,target; 15 int counter; 16 int move[4][2]= { 17 0,1, 18 1,0, 19 0,-1, 20 -1,0 21 }; 22 void BFS() { 23 while(!Q.empty()) { 24 S now = Q.front(); 25 Q.pop(); 26 bool dir[4]; 27 memset(dir,false,sizeof(dir)); 28 switch(maze[now.x][now.y]) { 29 case -: 30 dir[0]=true; 31 dir[2]=true; 32 break; 33 case |: 34 dir[1]=true; 35 dir[3]=true; 36 break; 37 case .: 38 dir[1]=true; 39 break; 40 case S: 41 case T: 42 case +: 43 memset(dir,true,sizeof(dir)); 44 break; 45 } 46 for(int i=0; i<4; i++) { 47 if(dir[i]) { 48 S news; 49 news.x=now.x+move[i][0]; 50 news.y=now.y+move[i][1]; 51 //printf("%d %d create:%d %d\n",now.x,now.y,news.x,news.y); 52 if(news.x<1||news.y<1||news.x>R||news.y>C||maze[news.x][news.y]==#||mark[news.x][news.y]==1) { 53 continue; 54 } else { 55 //printf("push!\n"); 56 Q.push(news); 57 mark[news.x][news.y]=1; 58 } 59 } 60 } 61 } 62 return; 63 } 64 int check(int i,char m) { 65 switch(i) { 66 case 0: 67 case 2: 68 if(m==+||m==-||m==S) 69 return 1; 70 else return 0; 71 break; 72 case 1: 73 if(m==+||m==|||m==S) 74 return 1; 75 else return 0; 76 break; 77 case 3: 78 if(m==+||m==|||m==S||m==.) 79 return 1; 80 else return 0; 81 break; 82 } 83 } 84 void BFS2() { 85 while(!Q2.empty()) { 86 S now = Q2.front(); 87 Q2.pop(); 88 for(int i=0; i<4; i++) { 89 S news; 90 news.x=now.x+move[i][0]; 91 news.y=now.y+move[i][1]; 92 if(news.x<1||news.y<1||news.x>R||news.y>C||maze[news.x][news.y]==#||mark2[news.x][news.y]==1) { 93 continue; 94 } else if(check(i,maze[news.x][news.y])!=1) { 95 continue; 96 } else { 97 Q2.push(news); 98 mark2[news.x][news.y]=1; 99 } 100 } 101 102 } 103 return; 104 } 105 void comp() { 106 int divide=0; 107 for(int i=1; i<=R; i++) { 108 for(int j=1; j<=C; j++) { 109 if(mark[i][j]==1&&mark2[i][j]==0) { 110 counter++; 111 } 112 if(mark[i][j]==1&&mark2[i][j]==1) { 113 divide++; 114 } 115 } 116 } 117 if(divide==0) { 118 printf("I‘m stuck!\n"); 119 return; 120 } 121 printf("%d\n",counter); 122 123 } 124 int main() { 125 126 #ifdef LOCAL 127 freopen("data.in","r",stdin); 128 #endif 129 while(scanf("%d%d",&R,&C)!=EOF) { 130 scanf("\n"); 131 memset(maze,\0,sizeof(maze)); 132 memset(mark,\0,sizeof(mark)); 133 memset(mark2,\0,sizeof(mark2)); 134 counter=0; 135 while(!Q.empty()) Q.pop(); 136 while(!Q2.empty()) Q2.pop(); 137 for(int i=1; i<=R; i++) { 138 for(int j=1; j<=C; j++) { 139 char k; 140 scanf("%c",&k); 141 maze[i][j]=k; 142 if(k==S) { 143 start.x=i; 144 start.y=j; 145 } 146 if(k==T) { 147 target.x=i; 148 target.y=j; 149 } 150 } 151 scanf("\n"); 152 } 153 154 Q.push(start); 155 mark[start.x][start.y]=1; 156 BFS(); 157 158 Q2.push(target); 159 mark2[target.x][target.y]=1; 160 BFS2(); 161 162 /* 163 printf("*********************\n"); 164 for(int i=1; i<=R; i++) { 165 for(int j=1; j<=C; j++) { 166 printf("%d ",mark[i][j]); 167 } 168 printf("\n"); 169 } 170 printf("*********************\n"); 171 for(int i=1; i<=R; i++) { 172 for(int j=1; j<=C; j++) { 173 printf("%d ",mark2[i][j]); 174 } 175 printf("\n"); 176 } 177 printf("*********************\n"); 178 */ 179 comp(); 180 181 } 182 return 0; 183 }

 

【ACM】CCF I’m stuck! BFS

标签:

原文地址:http://www.cnblogs.com/windcarp/p/4802386.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!