#include<bits/stdc++.h>
using namespace std;
const int dx[]={0,1,0,-1,0};
const int dy[]={0,0,1,0,-1};
int n,m,bo[60][60],xx,yy,KK,B[60][60],bk[60],p,b[60][60],ans;
char ch,c[60][60];
struct node{int x,y;};
struct kuai{int num,key[30];vector<node> door;}K[2510];
queue<node> q;
void bfs(int qx,int qy)
{
q.push((node){qx,qy});bo[qx][qy]=++p;K[p].num=1;if(c[qx][qy]>='a'&&c[qx][qy]<='z') K[p].key[c[qx][qy]-'A'+1]++,K[p].num--;
while(!q.empty())
{
node u=q.front();q.pop();
if(qx==1&&qy==3) cout<<u.x<<" "<<u.y<<endl;
for(int i=1;i<=4;i++)
{
int cx=u.x+dx[i],cy=u.y+dy[i];
if(cx<1||cx>n||cy<1||cy>m||b[cx][cy]||bo[cx][cy]) continue;
if(qx==1&&qy==3) cout<<u.x<<" "<<u.y<<" "<<cx<<" "<<cy<<endl;
if(c[cx][cy]>='A'&&c[cx][cy]<='Z')
{
cout<<cx<<' '<<cy;//第24行
K[p].door.push_back((node){cx,cy});
cout<<endl<<cx<<" "<<cy;//第26行
continue;
}
if(cx==xx&&cy==yy) {KK=p;continue;}
if(c[cx][cy]>='a'&&c[cx][cy]<='z') K[p].key[c[cx][cy]-'a'+1]++,K[p].num--;
K[p].num++;q.push((node){cx,cy});bo[cx][cy]=p;
}
}
}
int dfs(int x,int y,kuai u)
{
int ans=0;
for(int i=1;i<=4;i++)
{
int cx=x+dx[i];
int cy=y+dy[i];
if(cx<1||cx>n||cy<1||cy>m||b[cx][cy]) continue;
if(bo[cx][cy]>0&&!bk[bo[cx][cy]])
{
if(bo[cx][cy]==KK) return 1;
bk[bo[cx][cy]]=1;
for(int j=1;j<=26;j++) u.key[j]+=K[bo[cx][cy]].key[j];
for(int i=0;i<=K[bo[cx][cy]].door.size()-1;i++)
if(u.key[c[K[bo[cx][cy]].door[i].x][K[bo[cx][cy]].door[i].y]-'A'+'a']&&!B[K[bo[cx][cy]].door[i].x][K[bo[cx][cy]].door[i].y])
{
u.key[c[K[bo[cx][cy]].door[i].x][K[bo[cx][cy]].door[i].y]-'A'+'a']--;
B[K[bo[cx][cy]].door[i].x][K[bo[cx][cy]].door[i].y]=1;
ans|=dfs(K[bo[cx][cy]].door[i].x,K[bo[cx][cy]].door[i].y,u);
B[K[bo[cx][cy]].door[i].x][K[bo[cx][cy]].door[i].y]=0;
u.key[c[K[bo[cx][cy]].door[i].x][K[bo[cx][cy]].door[i].y]-'A'+'a']++;
}
for(int j=1;j<=26;j++) u.key[j]-=K[bo[cx][cy]].key[j];
bk[bo[cx][cy]]=0;
}
else if(u.key[c[cx][cy]-'A'+'a'])
{
u.key[c[cx][cy]-'A'+'a']--;
B[cx][cy]=1;
ans|=dfs(cx,cy,u);
B[cx][cy]=0;
u.key[c[cx][cy]-'A'+'a']++;
}
}
return ans;
}
int Dfs(int kk)
{
memset(B,0,sizeof(B));
memset(bk,0,sizeof(bk));
bk[kk]=1;int ans=0;kuai p;
for(int i=1;i<=26;i++) p.key[i]+=K[kk].key[i];
if(K[kk].door.empty()) return 0;
for(int i=0;i<=K[kk].door.size()-1;i++)
if(p.key[c[K[kk].door[i].x][K[kk].door[i].y]-'A'+'a'])
{
p.key[c[K[kk].door[i].x][K[kk].door[i].y]-'A'+'a']--;
B[K[kk].door[i].x][K[kk].door[i].y]=1;
ans|=dfs(K[kk].door[i].x,K[kk].door[i].y,p);
B[K[kk].door[i].x][K[kk].door[i].y]=0;
p.key[c[K[kk].door[i].x][K[kk].door[i].y]-'A'+'a']++;
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>ch;
if(ch=='#') b[i][j]=1;
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) c[i][j]=ch;
if(ch=='*') xx=i,yy=j;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!bo[i][j]&&!b[i][j])
bfs(i,j);
cout<<p;
for(int i=1;i<=p;i++) if(K[i].num&&Dfs(i)) ans+=K[i].num;
cout<<ans;
return 0;
}
求助为什么此程序输出24行之后停止运行,即不运行26行
3 5
a#a#*
#..#.
a..A.
RE输入数据