XJOI3679望改正

你正在设计一个网格地图游戏,网格满足如下条件
1:恰好有一个出口
2:可能有一些门,门的标号为大写字母A-Z,每种门最多只有一个
3:可能有一些钥匙,钥匙的标号为小写字母a-z,每种钥匙只能打开对应的大写字母的门
4:可能有一些空地,空地的标号为小数点
5:可能有一些障碍,障碍不能经过
对于一个地图,你想要知道有多少的空地可以到达出口,为了使游戏显得不那么简单,你想要知道到达出口至少开一扇门的的空地有多少个

输入格式:
第一行输入两个整数n,m, (1≤n≤50)
接下来n行每行输入m个字符 (1≤m≤50)
'.' 代表空地
'#' 代表障碍
'*'代表出口
输出格式:
输出一个整数

img

#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<

超时了,有一些死循环