标签:
过两天准备去考ccf了。。这个信息获得的有点晚,提前熟悉一下做做模拟题,但是好像起步晚了些。。不碍事不碍事,还有一天好好准备,练两道题,觉得300分还是可以过的!
就这这个题也写点考试的注意事项:
首先要注意时间,考试全程4个小时,按照估算大概1-1.5小时可以做完前面3题,然后开始啃后面的大题。一般来说,大题是一题搜索一题动态规划,一个小时一题的预估。
第二,可以携带纸质资料,平时看的最熟的算法书带上,做题目时还是尽量自己思考,需要参考再看,不要上来就狂翻书。
第三,注意节奏,一般前三题可以依照开始的冲劲做完,但是后面就要调节一下。
第四,思路重要,拿到题目先定思路,然后做的过程中注意细节(如不用getchar,横坐标和纵坐标),测试用例一般为:一般--》极限值--》不对称--》多用例痕迹,不过一定多看题目要求。
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 }
标签:
原文地址:http://www.cnblogs.com/windcarp/p/4802386.html