给出一个 n×n 的字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动, 若移动到了小写字母的格子就不能移动到对应的大写字母的格子, 若移动到了大写字母的格子就不能移动到对应的小写字母的格子 。 问从左上角到右下角至少要几步。
样例:
6
DdaAaA
CBAcca
eEaeeE
bBbabB
DbDdDc
fFaAaC
输出 :
13
样例解释:
D.....
C.....
e.....
b.bab.
DbD.D.
....aC
#include<bits/stdc++.h>
using namespace std;
int n,ans[105][105];
char mp[105][105];
bool vis[205];
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
void bfs(){
queue<int> qx,qy;
qx.push(1);
qy.push(1);
ans[1][1]=0;
char noip=mp[1][1];
if(noip>='A'&&noip<='Z')vis[(noip-'A'+'a')]=1/*,cout<<noip<<"的小写被标记\n"*/;
else if(noip>='a'&&noip<='z')vis[(noip-'a'+'A')]=1/*,cout<<noip<<"的大写被标记\n"*/;
while(!qx.empty()){
int x=qx.front(),y=qy.front();
qx.pop(),qy.pop();
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx>=1&&xx<=n&&yy>=1&&yy<=n){
char ioi=mp[xx][yy];
if(ioi>='A'&&ioi<='Z'&&vis[(ioi-'A'+'a')]==0&&ans[xx][yy]==0x3f3f3f3f){
//cout<<mp[xx][yy]<<"的小写被标记\n";
vis[(ioi-'A'+'a')]=1;
ans[xx][yy]=ans[x][y]+1;
qx.push(xx),qy.push(yy);
}else if(ioi>='a'&&ioi<='z'&&vis[(ioi-'a'+'A')]==0&&ans[xx][yy]==0x3f3f3f3f){
//cout<<mp[xx][yy]<<"的大写被标记\n";
vis[(ioi-'a'+'A')]=1;
ans[xx][yy]=ans[x][y]+1;
qx.push(xx),qy.push(yy);
}
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>mp[i][j];
memset(ans,0x3f,sizeof(ans));
bfs();
cout<<ans[n][n];
return 0;
}