zoukankan      html  css  js  c++  java
  • ccf I’m stuck!

    问题描述
    试题编号: 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 ");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
  • 相关阅读:
    使用C#代码审批/转签K2 Blackpearl流程
    K2 K2Blackpearl安装步骤详解(服务端)
    部署K2 Blackpearl流程时出错(由于目标计算机积极拒绝,无法连接)
    部署K2 Blackpearl流程时出错(与基础事务管理器的通信失败或Communication with the underlying transaction manager has failed.
    解析AFNetWorking 网络框架(二)
    python学习——练习题(5)
    python学习——练习题(4)
    python学习——练习题(3)
    python学习——练习题(2)
    python学习——练习题(1)
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4374629.html
Copyright © 2011-2022 走看看