试题编号: | 201312-5 |
试题名称: | I’m stuck! |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思: 输入格式 输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。 输出格式 如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。 样例输入 5 5 样例输出 2 样例说明 如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示: |
#include<iostream>
#include<cstring>
using namespace std;
int vis[51][51]={0};
int node[51][51]={0};
char mp[51][51];
int n,m;
int end1=0,end2=0;
int judge(int x,int y){
if(x<0 || x>=n || y<0 || y>=m)return 0;
if(mp[x][y]=='#' || vis[x][y]==1)return 0;
return 1;
}
int DFS(int x,int y,int flag){//flag为1表示找S能够到达的点,flag为2表示S能到达的点寻找终点
vis[x][y]=1;
if(flag==1)node[x][y]=1;
switch(mp[x][y]){
case 'S':
case '+':if(judge(x-1,y))DFS(x-1,y,flag);
if(judge(x+1,y))DFS(x+1,y,flag);
if(judge(x,y-1))DFS(x,y-1,flag);
if(judge(x,y+1))DFS(x,y+1,flag);
break;
case '-':if(judge(x,y-1))DFS(x,y-1,flag);
if(judge(x,y+1))DFS(x,y+1,flag);
break;
case '|':if(judge(x-1,y))DFS(x-1,y,flag);
if(judge(x+1,y))DFS(x+1,y,flag);
break;
case '.':if(judge(x+1,y))DFS(x+1,y,flag);
break;
case 'T':if(flag==2)end2=1;
else{
if(judge(x-1,y))DFS(x-1,y,flag);
if(judge(x+1,y))DFS(x+1,y,flag);
if(judge(x,y-1))DFS(x,y-1,flag);
if(judge(x,y+1))DFS(x,y+1,flag);
end1=1;
}
break;
}
}
int main(){
cin>>n>>m;
int x,y;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>mp[i][j];
if(mp[i][j]=='S'){
x=i;y=j;
}
}
}
DFS(x,y,1);
if(end1==0)cout<<"I'm stuck!";
else{
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(node[i][j]==1){
memset(vis,0,sizeof(vis));
end2=0;
DFS(i,j,2);
if(end2==0)ans++;
}
}
}
cout<<ans;
}
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答