首先声明,我不会广搜,所以只好用深搜了
#include<bits/stdc++.h>
using namespace std;
char _map[1201][1201];
bool _feet[1201][1201];
long long minn=LONG_LONG_MAX,n;
void dfs(long long step,int x,int y){
if(step>=minn)return ;
if(_map[x][y]=='*'||x>n||y>n||x==0||y==0){
return ;
}
if(x==n&&y==n){
minn=min(minn,step);
return ;
}
if(_map[x][y]=='A'){
if(_feet[x+1][y]==0){
_feet[x+1][y]=1;
dfs(step+1,x+1,y);
}
if(_feet[x-1][y]==0){
_feet[x-1][y]=1;
dfs(step+1,x-1,y);
}
if(_feet[x][y-1]==0){
_feet[x][y-1]=1;
dfs(step+1,x,y-1);
}
if(_feet[x][y+1]==0){
_feet[x][y+1]=1;
dfs(step+1,x,y+1);
}
}
else if(_map[x][y]=='B'){
if(_feet[x+2][y]==0&&x+2<=n){
_feet[x+2][y]=1;
dfs(step+1,x+2,y);
}
if(_feet[x-2][y]==0&&x-2>=0){
_feet[x-2][y]=1;
dfs(step+1,x-2,y);
}
if(_feet[x][y-2]==0&&y-2>=0){
_feet[x][y-2]=1;
dfs(step+1,x,y-2);
}
if(_feet[x][y+2]==0&&y+2<=n){
_feet[x][y+1]=1;
dfs(step+1,x,y+2);
}
}
else if(_map[x][y]=='C'){
if(_feet[x+1][y+1]==0){
_feet[x+1][y+1]=1;
dfs(step+2,x+1,y+1);
}
if(_feet[x+1][y-1]==0){
_feet[x+1][y-1]=1;
dfs(step+2,x+1,y-1);
}
if(_feet[x-1][y+1]==0){
_feet[x-1][y+1]=1;
dfs(step+2,x-1,y+1);
}
if(_feet[x-1][y-1]==0){
_feet[x-1][y-1]=1;
dfs(step+2,x-1,y-1);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>_map[i][j];
}
}
_feet[1][1]=1;
dfs(1,1,1);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
_feet[i][j]=0;
}
}
_feet[1][n]=1;
dfs(1,1,n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
_feet[i][j]=0;
}
}
_feet[n][1]=1;
dfs(1,n,1);
if(minn!=LONG_LONG_MAX)cout<<minn;
else cout<<"No answer";
}