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

ccf I’m stuck!

时间:2015-03-28 20:21:56      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:

问题描述
试题编号: 201312-5
试题名称:
  //搜索
1
#include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=100; 4 char mat[maxn][maxn]; 5 struct node 6 { 7 int point; 8 }; 9 node q[maxn*maxn]; 10 int start,fin; 11 int top,base; 12 int ans,tx,ty; 13 int n,m; 14 bool flag=0; 15 bool vis1[maxn][maxn],vis2[maxn][maxn]; 16 int next[4][2]={-1,0,1,0,0,-1,0,1}; 17 bool can(int ll,int rr) 18 { 19 return ll>=0&&ll<=n-1&&rr>=0&&rr<=m-1; 20 } 21 void bfs1() 22 { 23 while(base<top){ 24 int l=q[base].point/m,r=q[base].point%m,ll,rr; 25 if(mat[l][r]==+||mat[l][r]==S||mat[l][r]==T){ 26 for(int i=0;i<4;i++) 27 { 28 ll=l+next[i][0];rr=r+next[i][1]; 29 if(can(ll,rr)&&!vis1[ll][rr]&&mat[ll][rr]!=#){ 30 vis1[ll][rr]=1; 31 q[top].point=ll*m+rr; 32 top++; 33 } 34 } 35 } 36 if(mat[l][r]==-){ 37 for(int i=2;i<4;i++) 38 { 39 ll=l+next[i][0];rr=r+next[i][1]; 40 if(can(ll,rr)&&!vis1[ll][rr]&&mat[ll][rr]!=#){ 41 vis1[ll][rr]=1; 42 q[top].point=ll*m+rr; 43 top++; 44 } 45 } 46 } 47 if(mat[l][r]==|){ 48 for(int i=0;i<2;i++) 49 { 50 ll=l+next[i][0];rr=r+next[i][1]; 51 if(can(ll,rr)&&!vis1[ll][rr]&&mat[ll][rr]!=#){ 52 vis1[ll][rr]=1; 53 q[top].point=ll*m+rr; 54 top++; 55 } 56 } 57 } 58 if(mat[l][r]==.){ 59 for(int i=1;i<2;i++) 60 { 61 ll=l+next[i][0];rr=r+next[i][1]; 62 if(can(ll,rr)&&!vis1[ll][rr]&&mat[ll][rr]!=#){ 63 vis1[ll][rr]=1; 64 q[top].point=ll*m+rr; 65 top++; 66 } 67 } 68 } 69 base++; 70 } 71 if(vis1[tx][ty]) flag=1; 72 } 73 74 void bfs2() 75 { 76 while(base<top){ 77 int l=q[base].point/m,r=q[base].point%m,ll,rr; 78 for(int i=0;i<4;i++) 79 { 80 ll=l+next[i][0];rr=r+next[i][1]; 81 if(i==0){ 82 if(can(ll,rr)&&!vis2[ll][rr]&&(mat[ll][rr]==+||mat[ll][rr]==S||mat[ll][rr]==T||mat[ll][rr]==|||mat[ll][rr]==.)){ 83 vis2[ll][rr]=1; 84 q[top].point=ll*m+rr; 85 top++;} 86 } 87 else if(i==1){ 88 if(can(ll,rr)&&!vis2[ll][rr]&&(mat[ll][rr]==+||mat[ll][rr]==S||mat[ll][rr]==T||mat[ll][rr]==|)){ 89 vis2[ll][rr]=1; 90 q[top].point=ll*m+rr; 91 top++;} 92 } 93 else if(i==2||i==3){ 94 if(can(ll,rr)&&!vis2[ll][rr]&&(mat[ll][rr]==+||mat[ll][rr]==S||mat[ll][rr]==T||mat[ll][rr]==-)){ 95 vis2[ll][rr]=1; 96 q[top].point=ll*m+rr; 97 top++;} 98 } 99 } 100 base++; 101 } 102 } 103 int main() 104 { 105 //freopen("in.txt","r",stdin); 106 while(~scanf("%d%d",&n,&m)){ 107 flag=0; 108 memset(vis1,0,sizeof(vis1)); 109 memset(vis2,0,sizeof(vis2)); 110 for(int i=0;i<n;i++) 111 { 112 scanf("%s",mat[i]); 113 } 114 //if(n>=48){printf("0\n");continue;} 115 for(int i=0;i<n;i++) 116 for(int j=0;j<m;j++) 117 { 118 if(mat[i][j]==S){ 119 start=i*m+j; 120 } 121 else if(mat[i][j]==T){ 122 fin=i*m+j; 123 tx=i;ty=j; 124 } 125 } 126 top=base=0; 127 q[top].point=start; 128 top++; 129 vis1[start/m][start%m]=1; 130 bfs1(); 131 if(!flag) {puts("I‘m stuck!");continue;} 132 top=base=0; 133 q[top].point=fin; 134 top++; 135 vis2[fin/m][fin%m]=1; 136 bfs2(); 137 int ans=0; 138 for(int i=0;i<n;i++) 139 for(int j=0;j<m;j++) 140 { 141 if(vis1[i][j]&&!vis2[i][j]){ 142 ans++; 143 } 144 } 145 cout<<ans<<endl; 146 } 147 return 0; 148 }

 

时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  给定一个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

ccf I’m stuck!

标签:

原文地址:http://www.cnblogs.com/codeyuan/p/4374629.html

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