你正在设计一个网格地图游戏,网格满足如下条件
1:恰好有一个出口
2:可能有一些门,门的标号为大写字母A-Z,每种门最多只有一个
3:可能有一些钥匙,钥匙的标号为小写字母a-z,每种钥匙只能打开对应的大写字母的门
4:可能有一些空地,空地的标号为小数点
5:可能有一些障碍,障碍不能经过
对于一个地图,你想要知道有多少的空地可以到达出口,为了使游戏显得不那么简单,你想要知道到达出口至少开一扇门的的空地有多少个
输入格式:
第一行输入两个整数n,m, (1≤n≤50)
接下来n行每行输入m个字符 (1≤m≤50)
'.' 代表空地
'#' 代表障碍
'*'代表出口
输出格式:
输出一个整数
#include
#include
#include
using namespace std;
struct node{
int x,y,shttps://img-mid.csdnimg.cn/release/static/image/mid/ask/012300108466168.png "#left")
tep,k;
};
char a[51][51];
int n,m,s,d,ans=0,sum,f1;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
void bfs(){
f1=0;
queue q;
q.push({s,d,0,0});
int zzs[27]={};
while(!q.empty()){
node f=q.front();
q.pop();
if(a[f.x][f.y]=='*'&&f.step==1){
f1=1;
ans++;
return ;
}
if(a[f.x][f.y]>='a'&&a[f.x][f.y]<='z'){
zzs[a[f.x][f.y]-'a']=1;
}
if(a[f.x][f.y]>='A'&&a[f.x][f.y]<='Z'){
if(zzs[a[f.x][f.y]+32-'a']==1){
zzs[a[f.x][f.y]+32-'a']=0;
f.step=1;
}else{
continue;
}
}
for(int i=0;i<4;i++){
int xx=f.x+dx[i];
int yy=f.y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]!='#'){
if(f.k+1>=n*m-sum){
return ;
}else{
q.push({xx,yy,f.step,f.k+1});
//cout<>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
if(a[i][j]=='#') sum++;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]!='#'){
s=i;
d=j;
bfs();
if(f1==1&&(a[i][j]>='a'&&a[i][j]<='z')){
ans--;
}
}
}
}
cout<
超时了,有一些死循环