https://www.luogu.com.cn/discuss/877031
新求条代码:
#include<bits/stdc++.h>
using namespace std;
int n=1,ans=0x3f3f3f3f;
//bool vis[255];
char a[105][105];
const int tx[]={0,0,1,-1};
const int ty[]={1,-1,0,0};
/*void bfs(){
queue<int> qx,qy;
qx.push(0),qy.push(0);
ans[0][0]=0;
while(!qx.empty()){
int x=qx.front(),y=qy.front();
qx.pop(),qy.pop();
cout<<x<<" "<<y<<" "<<ans[x][y]<<endl;
for(int i=0;i<4;i++){
int xx=x+tx[i],yy=y+ty[i];
if(xx>=0&&yy>=0&&xx<n&&yy<n){
if(a[xx][yy]>='A'&&a[xx][yy]<='Z'&&vis[a[xx][yy]+32]==0&&ans[xx][yy]==0x3f3f3f3f){
ans[xx][yy]=ans[x][y]+1;
vis[a[xx][yy]+32]=1;
qx.push(xx);
qy.push(yy);
vis[a[xx][yy]+32]=0;
}else if(a[xx][yy]>='a'&&a[xx][yy]<='z'&&vis[a[xx][yy]-32]==0&&ans[xx][yy]==0x3f3f3f3f){
ans[xx][yy]=ans[x][y]+1;
vis[a[xx][yy]-32]=1;
qx.push(xx);
qy.push(yy);
vis[a[xx][yy]-32]=0;
}
}
}
}
}*/
char tobig(char ch){
return (ch-'a'+'A');
}
char tosmall(char ch){
return (ch-'A'+'a');
}
bool isbig(char ch){
return (ch>='A'&&ch<='Z');
}
bool issmall(char ch){
return (ch>='a'&&ch<='z');
}
map<char,int> vis;
void dfs(int x,int y,int cost){
//cout<<x<<" "<<y<<" "<<cost<<"\n";
if((x||y)&&vis[a[x][y]])return;
if(x==n-1&&y==n-1){
ans=min(ans,cost);
return;
}
for(int i=0;i<4;i++){
int xx=x+tx[i],yy=y+ty[i];
if(xx>=0&&xx<n&&yy>=0&&yy<n){
if(a[xx][yy]>='a'&&a[xx][yy]<='z'){
if(vis[a[xx][yy]-'a'+'A'])continue;
vis[a[xx][yy]-'a'+'A']=1;
dfs(xx,yy,cost+1);
vis[a[xx][yy]-'a'+'A']=0;
}else if(a[xx][yy]>='A'&&a[xx][yy]<='Z'){
if(vis[a[xx][yy]-'A'+'a'])continue;
vis[a[xx][yy]-'A'+'a']=1;
dfs(xx,yy,cost+1);
vis[a[xx][yy]-'A'+'a']=0;
}
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)cin>>a[i][j];
}
if(isbig(a[0][0]))vis[tosmall(a[0][0])]=1;
else vis[tobig(a[0][0])]=1;
dfs(0,0,0);
cout<<ans;
return 0;
}