严厉抵制ctj行为,大逆不道!

#include<bits/stdc++.h>
using namespace std;
const int maxn=25;//好习惯
int w,sx,sy,fx,fy,minn=0x3f3f3f,cnt;
bool flag[maxn][maxn];
char maze[maxn][maxn];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct p{
	int x,y,step;
};
queue<p> q;
struct d{
	int xx,yy;
}ds[maxn]; 
void dfs(int x,int y,int step){
	//cout<<x<<' '<<y<<' '<<step<<endl;
	if(x==fx&&y==fy){
		if(step==minn)cnt++;
		return;
	}
	for(int i=0;i<4;i++){
		int nx=x+dx[i];
		int ny=y+dy[i];
		//cout<<nx<<' '<<ny<<' '<<flag[nx][ny]<<endl;
		if(nx>w||ny>w||nx<1||ny<1||flag[nx][ny]==true)continue;//裁掉 
		if(maze[nx][ny]>='a'&&maze[nx][ny]<='z'){
			nx=ds[maze[nx][ny]-'a'+1].xx-nx;
			ny=ds[maze[nx][ny]-'a'+1].yy-ny;//处理传送门 
		}
		flag[nx][ny]=true;
		dfs(nx,ny,step+1);
		flag[nx][ny]=false;
	}
}
int main(){
	cin>>w;
	for(int i=1;i<=w;i++){
		for(int j=1;j<=w;j++){
			cin>>maze[i][j];
			if(maze[i][j]=='~')flag[i][j]=false;
			if(maze[i][j]=='#')flag[i][j]=true;//障碍不能通过 
			if(maze[i][j]=='$'){//起点 
				sx=i;sy=j;
			}if(maze[i][j]=='&'){//终点 
				fx=i;fy=j;
			}if(maze[i][j]>='a'&&maze[i][j]<='z'){
				ds[maze[i][j]-'a'+1].xx+=i;//算出和求差即可实现传送 
				ds[maze[i][j]-'a'+1].yy+=j;
			}
		}
	}/*
	cout<<maze[5][4]<<flag[5][4]<<endl;
	for(int i=1;i<=w;i++){
		for(int j=1;j<=w;j++){
			cout<<maze[i][j]<<flag[i][j]<<' ';
		}
		cout<<endl;
	}*/
	p s;
	s.x=sx;s.y=sy;s.step=0;
	q.push(s);
	while(!q.empty()){
		p n=q.front();
		q.pop();//一定要记住否则死循环 
		if(n.x==fx&&n.y==fy){
			minn=n.step;//bfs最大的特点就是搜到就是答案 
			break;
		}for(int i=0;i<4;i++){
			int nx=n.x+dx[i];
			int ny=n.y+dy[i];
			if(nx>w||ny>w||nx<1||ny<1||flag[nx][ny])continue;//裁掉 
			if(maze[nx][ny]>='a'&&maze[nx][ny]<='z'){
				nx=ds[maze[nx][ny]-'a'+1].xx-nx;
				ny=ds[maze[nx][ny]-'a'+1].yy-ny;//处理传送门 
			}
			flag[nx][ny]=true;
			p t;
			t.x=nx;t.y=ny;t.step=n.step+1;
			q.push(t);
		}
	}
	for(int i=1;i<=w;i++){
		for(int j=1;j<=w;j++){
			if(maze[i][j]=='#')flag[i][j]=true;
			else flag[i][j]=false;//记得重置不然会死得跟我一样惨
		}
	}
	flag[sx][sy]=true;
	dfs(sx,sy,0);
	printf("%d %d",minn,cnt);
	return 0;
}