#1 #5 #8 #10 #12 AC,其他全部WA
蒟蒻用记搜的dfs
#include<cstdio>
#include<cstring>
struct csm
{
int x1,y1;
int x2,y2;
bool tmp;
}c[30];
int N,M;
char g[305][305];
bool vis[305][305];
int f[305][305];
int minn=0x3f3f3f3f;
int nxtx[4]={1,-1,0,0};
int nxty[4]={0,0,1,-1};
void dfs(int x,int y,int step)
{
if(step>minn) return ;
if(g[x][y]=='=')
{
if(minn>step) minn=step;
return ;
}
vis[x][y]=1;
if(step>=f[x][y]) return ;
f[x][y]=step;
for(int i=0;i<4;i++)
{
int nx=x+nxtx[i];
int ny=y+nxty[i];
if(vis[nx][ny]||g[nx][ny]=='#') continue;
if(g[nx][ny]>='A'&&g[nx][ny]<='Z')
{
if(nx==c[g[nx][ny]-'A'].x1&&ny==c[g[nx][ny]-'A'].y1)
{
if(!vis[c[g[nx][ny]-'A'].x2][c[g[nx][ny]-'A'].y2]) dfs(c[g[nx][ny]-'A'].x2,c[g[nx][ny]-'A'].y2,step+1);
}
else if(!vis[c[g[nx][ny]-'A'].x1][c[g[nx][ny]-'A'].y1]) dfs(c[g[nx][ny]-'A'].x1,c[g[nx][ny]-'A'].y1,step+1);
}
else dfs(nx,ny,step+1);
}
vis[x][y]=0;
}
int main()
{
memset(f,0x3f3f3f3f,sizeof(f));
int x,y;
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
scanf(" %c",&g[i][j]);
if(g[i][j]=='@')
{
x=i;
y=j;
}
if(g[i][j]>='A'&&g[i][j]<='Z')
{
if(!c[g[i][j]-'A'].tmp)
{
c[g[i][j]-'A'].x1=i;
c[g[i][j]-'A'].y1=j;
c[g[i][j]-'A'].tmp=1;
}
else
{
c[g[i][j]-'A'].x2=i;
c[g[i][j]-'A'].y2=j;
}
}
}
dfs(x,y,0);
printf("%d",minn);
return 0;
}