CSP-201312

 桶来一下就好了。

 坑点是'X',容易忽略掉。

 暴力可以A,但如果n过大就是以前做过的一道题目了,很经典。

 状压dp做的,考虑f[i][k]表示进行到第k位,当前数字状态为k时方案个数,k只有2^4=16种状态,最后f[n][15]即为答案,1A了开心。由于这个破网站不保存代码所以没代码可贴= =

试题编号: 201312-5
试题名称: I’m stuck!
时间限制: 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
只有这一道留下了代码 。
  很容易想到对S和T分别BFS一下然后找满足条件得点。T有些特殊,他需要找一条倒着走得路,一开始我只考虑了.感觉其他符号都无所谓最后发现了问题,针对每一个方向考虑就好了。举个例子说明:假如当前向上走,那么下一步得格子不可以是'-',一旦是'-'那么这条路反过来显然不可能成立,其他也同理把所有符号考虑下即可。
  1 #include<iostream>
  2 #include<bits/stdc++.h>
  3 using namespace std;
  4 #define LL long long 
  5 char e[55][55];
  6 int N,M;
  7 int Sx,Sy,Tx,Ty;
  8 bool f1[55][55],f2[55][55];
  9 int fx[4][2]={
 10 -1,0,
 11 1,0,
 12 0,-1,
 13 0,1
 14 };
 15 struct node{
 16     int x,y;
 17 };
 18 bool can(){
 19     memset(f1,0,sizeof(f1));
 20     queue<node>q;
 21     q.push(node{Sx,Sy});
 22     while(!q.empty()){
 23         node u=q.front();
 24         q.pop();
 25         int x=u.x,y=u.y;
 26         if(f1[x][y]==1)continue;
 27         f1[x][y]=1;
 28         if(e[x][y]=='S' || e[x][y]=='+'|| e[x][y]=='T'){
 29             for(int i=0;i<4;++i){
 30                 int dx=x+fx[i][0];;
 31                 int dy=y+fx[i][1];;
 32                 if(dx<1||dy<1||dx>N||dy>M||
 33                 e[dx][dy]=='#' || f1[dx][dy]==1)continue;
 34                 q.push(node{dx,dy});
 35             }
 36         }
 37         else if(e[x][y]=='-'){
 38                 for(int i=2;i<4;++i){
 39                 int dx=x+fx[i][0];;
 40                 int dy=y+fx[i][1];;
 41                 if(dx<1||dy<1||dx>N||dy>M||
 42                 e[dx][dy]=='#' || f1[dx][dy]==1)continue;
 43                 q.push(node{dx,dy});
 44             }
 45         }
 46         else if(e[x][y]=='|'){
 47                 for(int i=0;i<2;++i){
 48                 int dx=x+fx[i][0];;
 49                 int dy=y+fx[i][1];;
 50                 if(dx<1||dy<1||dx>N||dy>M||
 51                 e[dx][dy]=='#' || f1[dx][dy]==1)continue;
 52                 q.push(node{dx,dy});
 53             }
 54         }
 55         else if(e[x][y]=='.'){
 56                 for(int i=1;i<2;++i){
 57                 int dx=x+fx[i][0];;
 58                 int dy=y+fx[i][1];;
 59                 if(dx<1||dy<1||dx>N||dy>M||
 60                 e[dx][dy]=='#' || f1[dx][dy]==1)continue;
 61                 q.push(node{dx,dy});
 62             }
 63         }
 64     }
 65     return f1[Tx][Ty];
 66 }
 67 void gao1(){
 68     memset(f2,0,sizeof(f2));
 69     queue<node>q;
 70     q.push(node{Tx,Ty});
 71     while(!q.empty()){
 72         node u=q.front();
 73         q.pop();
 74         int x=u.x,y=u.y;
 75         if(f2[x][y]==1)continue;
 76         f2[x][y]=1;
 77         for(int i=0;i<4;++i){
 78             int dx=x+fx[i][0];
 79             int dy=y+fx[i][1];
 80             if(dx<1||dy<1||dx>N||dy>M||
 81                 e[dx][dy]=='#' || f2[dx][dy]==1)continue;
 82             if(i==0){
 83                 if(e[dx][dy]=='+'||e[dx][dy]=='|'||e[dx][dy]=='.'||e[dx][dy]=='S'||e[dx][dy]=='T')
 84                 q.push(node{dx,dy});
 85             }else if (i==1){
 86                 if(e[dx][dy]=='+'||e[dx][dy]=='|'||e[dx][dy]=='S'||e[dx][dy]=='T')
 87                 q.push(node{dx,dy});
 88             }else if (i==2){
 89                 if(e[dx][dy]=='+'||e[dx][dy]=='-'||e[dx][dy]=='S'||e[dx][dy]=='T')
 90                 q.push(node{dx,dy});
 91             }else{
 92                 if(e[dx][dy]=='+'||e[dx][dy]=='-'||e[dx][dy]=='S'||e[dx][dy]=='T')
 93                 q.push(node{dx,dy});
 94             }
 95         }
 96     }
 97 }
 98 int main(){
 99     cin>>N>>M;
100     for(int i=1;i<=N;++i)cin>>e[i]+1;
101     for(int i=1;i<=N;++i){
102         for(int j=1;j<=M;++j){
103             if(e[i][j]=='S'){
104                 Sx=i,Sy=j;
105             }
106             if(e[i][j]=='T'){
107                 Tx=i,Ty=j;
108             }
109         }
110     }
111     if(can()==0)cout<<"I'm stuck!"<<endl;
112     else{
113         gao1();
114         int ans=0;
115         for(int i=1;i<=N;++i){
116             for(int j=1;j<=M;++j){
117                 if(f1[i][j]==1&&f2[i][j]==0)ans++;
118             }
119         }
120         cout<<ans<<endl;
121     }
122     return 0;
123 } 
原文地址:https://www.cnblogs.com/zzqc/p/12104633.html