Problem Link : http://www.lightoj.com/volume_showproblem.php?problem=1066
/* +-+ +-+ +-+ |R| |.| |S| +-+ +-+ +-+ */ #include <bits/stdc++.h> #define pii pair <int,int> #define sc scanf #define pf printf #define Pi 2*acos(0.0) #define ms(a,b) memset(a, b, sizeof(a)) #define pb(a) push_back(a) #define MP make_pair #define db double #define ll long long #define EPS 10E-10 #define ff first #define ss second #define sqr(x) (x)*(x) #define D(x) cout<<#x " = "<<(x)<<endl #define VI vector <int> #define DBG pf("Hi\n") #define MOD 100007 #define MAX 10000 #define CIN ios_base::sync_with_stdio(0); cin.tie(0) #define SZ(a) (int)a.size() #define sf(a) scanf("%d",&a) #define sff(a,b) scanf("%d%d",&a,&b) #define sfff(a,b,c) scanf("%d%d%d",&a,&b,&c) #define loop(i,n) for(int i=0;i<n;i++) #define REP(i,a,b) for(int i=a;i<b;i++) #define TEST_CASE(t) for(int z=1;z<=t;z++) #define PRINT_CASE printf("Case %d: ",z) #define all(a) a.begin(),a.end() #define intlim 2147483648 #define inf 1000000 #define ull unsigned long long using namespace std; const int fx[]= {+1,-1,+0,+0}; const int fy[]= {+0,+0,+1,-1}; char ara[12][12],ch; int cnt,n; bool visited[12][12]; int d[12][12]; map<char,pii> mp; bool test(pii temp) { if(temp.ff<0 || temp.ff>=n || temp.ss<0 || temp.ss>=n || visited[temp.ff][temp.ss]|| ara[temp.ff][temp.ss]=='#') return 0; if(ara[temp.ff][temp.ss]>='A' && ara[temp.ff][temp.ss]<='Z') { if(ara[temp.ff][temp.ss]>ch) return 0; } return 1; } int bfs(pii src, pii dst) { pii u=src; visited[u.ff][u.ss]=1; d[u.ff][u.ss]=0; queue<pii>Q; Q.push(u); while(!Q.empty()) { u=Q.front(); Q.pop(); if(u==dst) return d[u.ff][u.ss]; pii v; for(int i=0; i<4; i++) { v.ff=u.ff+fx[i]; v.ss=u.ss+fy[i]; if(test(v)) { visited[v.ff][v.ss]=1; d[v.ff][v.ss]=d[u.ff][u.ss]+1; Q.push(v); } } } return -1; } int main() { ///freopen("in.txt","r",stdin); ///freopen("out.txt","w",stdout); int t; sf(t); TEST_CASE(t) { sf(n); cnt=0; loop(i,n) loop(j,n) { cin>>ara[i][j]; if(ara[i][j]>='A' && ara[i][j]<='Z') { cnt++; mp[ara[i][j]]=MP(i,j); } } int ans=0; bool ispossible=1; for(int i=0; i<cnt-1; i++) { int tmp=0; ch='A'+i+1; tmp=bfs(mp['A'+i],mp['A'+i+1]); ms(d,0); ms(visited,0); if(tmp==-1) { ispossible=0; break; } else ans+=tmp; } PRINT_CASE; if(ispossible) pf("%d\n",ans); else pf("Impossible\n"); mp.clear(); } return 0; }