mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
492bdd03ea
1800-1899
83 lines
1.7 KiB
C++
83 lines
1.7 KiB
C++
#include<cstdio>
|
|
#include<iostream>
|
|
#include<string>
|
|
#include<cstring>
|
|
#include<vector>
|
|
#include<set>
|
|
#include<map>
|
|
#include<queue>
|
|
#include<algorithm>
|
|
#include<cmath>
|
|
#define ll long long
|
|
#define mod 1000000007ll
|
|
#define N 100009
|
|
#define inf 1000000000ll;
|
|
using namespace std;
|
|
typedef pair<int,int> II;
|
|
int dx[]={0,0,-1,-1,1,1},
|
|
dy[]={-1,1,0,-1,0,1};
|
|
int n;
|
|
char s[100][100];
|
|
int d[100][100][1<<4],in[100][100][1<<4];
|
|
queue<int> Q;
|
|
int get(char c){
|
|
if(c=='.') return 0;
|
|
return 1<<(c-'A');
|
|
}
|
|
void update(int x,int y,int z,int v){
|
|
if(d[x][y][z]==-1||d[x][y][z]>v){
|
|
d[x][y][z]=v;
|
|
if(!in[x][y][z]) in[x][y][z]=1,Q.push(x*1600+y*16+z);
|
|
}
|
|
}
|
|
int main(){
|
|
while(scanf("%d",&n),n)
|
|
{
|
|
memset(s,0,sizeof(s));
|
|
memset(d,-1,sizeof(d));
|
|
memset(in,0,sizeof(in));
|
|
while(!Q.empty()) Q.pop();
|
|
char c;
|
|
for(int i=1;i<=n;i++)
|
|
for(int j=1;j<n+i;j++){
|
|
while(!isalpha(c=getchar())&&c!='.');
|
|
s[i][j]=c;
|
|
}
|
|
for(int i=2;i<=n;i++)
|
|
for(int j=1;j<=2*n-i;j++){
|
|
while(!isalpha(c=getchar())&&c!='.');
|
|
s[n+i-1][i+j-1]=c;
|
|
}
|
|
n=2*n-1;
|
|
for(int i=1;i<=n;i++)
|
|
for(int j=1;j<=n;j++)
|
|
if(isalpha(s[i][j]))
|
|
update(i,j,get(s[i][j]),0);
|
|
int x,y,z,tx,ty,tz;
|
|
while(!Q.empty()){
|
|
x=Q.front()/1600;
|
|
y=(Q.front()%1600)/16;
|
|
z=Q.front()%16;
|
|
in[x][y][z]=0;
|
|
Q.pop();
|
|
for(int i=0;i<6;i++){
|
|
tx=x+dx[i];
|
|
ty=y+dy[i];
|
|
if(!s[tx][ty]) continue;
|
|
tz=z|get(s[tx][ty]);
|
|
update(tx,ty,tz,d[x][y][z]+(s[tx][ty]=='.'));
|
|
}
|
|
int t=15-z;
|
|
for(int i=t;i;i=(i-1)&t)
|
|
if(d[x][y][i]!=-1)
|
|
update(x,y,z|i,d[x][y][i]+d[x][y][z]-(s[x][y]=='.'));
|
|
}
|
|
int ans=n*n;
|
|
for(int i=1;i<=n;i++)
|
|
for(int j=1;j<=n;j++)
|
|
if(s[i][j]&&d[i][j][15]!=-1)
|
|
ans=min(ans,d[i][j][15]);
|
|
printf("You have to buy %d parcels.\n",ans);
|
|
}
|
|
}
|