问题描述
给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:
'#': 任何时候玩家都不能移动到此方格;
'+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
'-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;
'|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;
'.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;
'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。
此外,玩家不能移动出地图。
请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家不可以从此方格移动到目标位置。
'#': 任何时候玩家都不能移动到此方格;
'+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
'-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;
'|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;
'.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;
'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;
'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。
此外,玩家不能移动出地图。
请找出满足下面两个性质的方格个数:
1. 玩家可以从初始位置移动到此方格;
2. 玩家不可以从此方格移动到目标位置。
输入格式
输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。
接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。
输出格式
如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
样例输入
5 5
--+-+
..|#.
..|##
S-+-T
####.
--+-+
..|#.
..|##
S-+-T
####.
样例输出
2
样例说明
如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:
--+-+
..|#X
..|##
S-+-T
####X
--+-+
..|#X
..|##
S-+-T
####X
——————————————————————————————————————————————————————————————————————
http://www.cnblogs.com/Ritchie/p/6141438.html
两次 DFS ,一次判断通否,并将走过的点标记, ,一次从终点出发往回走 , 每次需要(逆着)判读 前一点是否能到当前点
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int vis[55][55]={0}; 5 6 int ans =0; 7 8 int R,C; 9 10 //vector<vector<char> >v; // 定义 大 小 11 12 char v[53][53]={0}; 13 14 int s_i,s_j,t_i,t_j; 15 16 void dfs1(int i,int j) 17 { 18 if (vis[i][j]==1 || i<0 || i>=R || j<0 || j>=C || v[i][j]=='#')return ; 19 20 vis[i][j] = 1; // 不 用再置 为 0 !! 21 22 if (v[i][j]=='+') 23 { 24 dfs1(i-1,j); 25 dfs1(i+1,j); 26 dfs1(i,j+1); 27 dfs1(i,j-1); 28 } 29 30 else if (v[i][j]=='-') 31 { 32 dfs1(i,j-1); 33 dfs1(i,j+1); 34 } 35 36 else if (v[i][j]=='|') 37 { 38 dfs1(i+1,j); 39 dfs1(i-1,j); 40 } 41 42 else if (v[i][j]=='.') 43 { 44 dfs1(i+1,j); 45 } 46 47 } 48 49 50 bool hefa(int i,int j) 51 { 52 if (i<0 || i>=R || j<0 || j>=C)return false; 53 return true; 54 } 55 56 57 void dfs2(int i,int j) 58 { 59 if ( v[i][j]=='#' || vis[i][j]==2)return ; 60 //if(v[i][j]=='#'||i<0||i>=R||j<0||j>=C||vis[i][j]==2) return; 61 62 vis[i][j]=2; 63 64 // cout<<"--i,j "<<i<<" "<<j<<endl; 65 66 if ( hefa(i,j-1) && (v[i][j-1]=='-' || v[i][j-1]=='+')) 67 { 68 dfs2(i,j-1); 69 } 70 71 if (hefa(i,j+1) && (v[i][j+1]=='-' || v[i][j+1]=='+')) 72 { 73 dfs2(i,j+1); 74 } 75 76 if ( hefa(i+1,j) && (v[i+1][j]=='|' || v[i+1][j]=='+')) 77 { 78 dfs2(i+1,j); 79 } 80 81 if ( hefa(i-1,j) && (v[i-1][j]=='.'|| v[i-1][j]=='+' || v[i-1][j]=='|')) 82 { 83 dfs2(i-1,j); 84 } 85 86 87 } 88 89 int main() 90 { 91 92 cin>>R>>C; 93 // v.resize(R); 94 // for (int i=0;i<C;i++)v[i].resize(C); 95 96 97 for (int i=0;i<R;i++) 98 { 99 for (int j =0;j<C;j++) 100 { 101 char s; 102 cin>>s; 103 104 v[i][j]=s; 105 if (s=='S') 106 { 107 s_i = i; 108 s_j = j; 109 v[i][j] = '+'; 110 } 111 if (s=='T') 112 { 113 t_i = i; 114 t_j = j; 115 v[i][j] = '+'; 116 } 117 } 118 } 119 120 dfs1(s_i,s_j); 121 122 // for (int i=0;i<R;i++) 123 // { 124 // for (int j=0;j<C;j++)cout<<vis[i][j]<<" "; //cout<<v[i][j]; //cout<<vis[i][j]<<" "; 125 // cout<<endl; 126 // } 127 128 129 if (vis[t_i][t_j]==1) 130 { 131 dfs2(t_i,t_j); 132 for (int i=0;i<R;i++) 133 { 134 for (int j=0;j<C;j++) 135 { 136 if (vis[i][j]==1) 137 { 138 // cout<<"i,j "<<i<<" "<<j<<endl; 139 ans++; 140 } 141 } 142 } 143 cout<<ans<<endl; 144 } 145 else cout<< "I'm stuck!"<<endl; 146 147 return 0; 148 }