Red Huang

Red Huang

uva 11487

SPFA finds the shortest path for all English letters, along with all methods.

Remember that the English letters that have been visited can be visited again.

//  
//        GGGGGGGGGGGGG        CCCCCCCCCCCCC               AAA  
//     GGG::::::::::::G     CCC::::::::::::C              A:::A  
//   GG:::::::::::::::G   CC:::::::::::::::C             A:::::A  
//  G:::::GGGGGGGG::::G  C:::::CCCCCCCC::::C            A:::::::A  
// G:::::G       GGGGGG C:::::C       CCCCCC           A:::::::::A  
//G:::::G              C:::::C                        A:::::A:::::A  
//G:::::G              C:::::C                       A:::::A A:::::A  
//G:::::G    GGGGGGGGGGC:::::C                      A:::::A   A:::::A  
//G:::::G    G::::::::GC:::::C                     A:::::A     A:::::A  
//G:::::G    GGGGG::::GC:::::C                    A:::::AAAAAAAAA:::::A  
//G:::::G        G::::GC:::::C                   A:::::::::::::::::::::A  
// G:::::G       G::::G C:::::C       CCCCCC    A:::::AAAAAAAAAAAAA:::::A  
//  G:::::GGGGGGGG::::G  C:::::CCCCCCCC::::C   A:::::A             A:::::A  
//   GG:::::::::::::::G   CC:::::::::::::::C  A:::::A               A:::::A  
//     GGG::::::GGG:::G     CCC::::::::::::C A:::::A                 A:::::A  
//        GGGGGG   GGGG        CCCCCCCCCCCCCAAAAAAA                   AAAAAAA  
#include <iostream>  
#include <cstdio>  
#include <cstring>  
#include <algorithm>  
#include <cmath>  
#include <climits>  
#include <vector>  
#include <set>  
#include <map>  
#include <queue>  
#include <cctype>  
#include <utility>  
#include <ctime>  
using namespace std;  
#ifdef DEBUG  
#define debug(...) printf("DEBUG: "),printf(\_\_VA\_ARGS\_\_)  
#define gettime() end\_time=clock();printf("now running time is %.7f\\n",(float)(end\_time - start\_time)/CLOCKS\_PER\_SEC);  
#else  
#define debug(...)  
#define gettime()  
#endif  
typedef unsigned int uint;  
typedef long long int Int;  
#define Set(a,s) memset(a,s,sizeof(a))  
#define Write(w) freopen(w,"w",stdout)  
#define Read(r) freopen(r,"r",stdin)  
#define Pln() printf("\\n")  
#define I\_de(x,n)for(int i=0;i<n;i++)printf("%d ",x\[i\]);Pln()  
#define De(x)printf(#x"%d\\n",x)  
#define For(i,x)for(int i=0;i<x;i++)  
#define CON(x,y) x##y  
#define Pmz(dp,nx,ny)for(int hty=0;hty<ny;hty++){for(int htx=0;htx<nx;htx++){\\  
    printf("%d ",dp\[htx\]\[hty\]);}Pln();}  
#define M 12  
#define PII pair<int,int\>  
#define PB push\_back  
#define oo INT\_MAX  
#define Set\_oo 0x3f  
#define X first;  
#define Y second;  
#define FOR(it,c) for(\_\_typeof((c).begin()) it=(c).begin();it!=(c).end();it++)  
#define eps 1e-6  
clock\_t start\_time=clock(), end\_time;  
bool xdy(double x,double y){return x>y+eps;}  
bool xddy(double x,double y){return x>y-eps;}  
bool xcy(double x,double y){return x<y-eps;}  
bool xcdy(double x,double y){return x<y+eps;}  
int min3(int x,int y,int z){  
    int tmp=min(x,y);  
    return min(tmp,z);  
}  
int max3(int x,int y,int z){  
    int tmp=max(x,y);  
    return max(tmp,z);  
}  
char mz\[M\]\[M\];  
int kx\[30\],ky\[30\];  
int n;  
int path\[30\]\[30\];  
int meth\[30\]\[30\];  
int dx\[\]={0,0,1,-1};  
int dy\[\]={1,-1,0,0};  
int h;  
int mod=20437;  
void spfa(char a,char b){  
    a-='A';  
    b-='A';  
    path\[a\]\[b\]=oo;  
    int bx=kx\[a\];  
    int by=ky\[a\];  
    int ex=kx\[b\];  
    int ey=ky\[b\];  
//    debug("%d %d %d %d\\n",bx,by,ex,ey);  
    int dis\[M\]\[M\];  
    fill(&dis\[0\]\[0\],&dis\[M-1\]\[M-1\],oo);  
    dis\[bx\]\[by\]=0;  
  
    queue<PII> q;  
    q.push(PII(bx,by));  
    while(!q.empty()){  
        int x=q.front().X;  
        int y=q.front().Y;  
//        debug("%d %d\\n",x,y);  
//            debug("%c %c %d\\n",a+'A',b+'A',meth\[a\]\[b\]);  
        q.pop();  
        if(x==ex&&y==ey&&dis\[x\]\[y\]<=path\[a\]\[b\]){  
            path\[a\]\[b\]=dis\[x\]\[y\];  
            meth\[a\]\[b\]++;  
            continue;  
        }  
        for(int i=0;i<4;i++){  
            int nx=x+dx\[i\],ny=y+dy\[i\];  
            if(nx<0||nx>=n||ny<0||ny>=n)continue;  
            if(mz\[ny\]\[nx\]=='#')continue;  
            if(isalpha(mz\[ny\]\[nx\])&&mz\[ny\]\[nx\]>b+'A')continue;  
            if(dis\[nx\]\[ny\]>=dis\[x\]\[y\]+1){  
                dis\[nx\]\[ny\]=dis\[x\]\[y\]+1;  
                q.push(PII(nx,ny));  
            }  
        }  
    }  
    if(path\[a\]\[b\]==oo)path\[a\]\[b\]=-1;  
  
}  
void solve(){  
    Set(meth,0);  
    int ansdis=0,ansmeth=1;  
    int i;  
    for(i=1;i<h;i++){  
        spfa('A'+i-1,'A'+i);  
        if(path\[i-1\]\[i\]==-1)break;  
        ansdis=(ansdis+path\[i-1\]\[i\])%mod;  
        ansmeth=ansmeth\*(meth\[i-1\]\[i\]%mod);  
        ansmeth%=mod;  
    }  
    if(i==h){  
        printf("%d %d\\n",ansdis,ansmeth);  
    }else puts("Impossible");  
  
}  
int main() {  
    ios\_base::sync\_with\_stdio(0);  
    int ff=0;  
    while(~scanf("%d",&n)&&n){  
        h=0;  
        for(int i=0;i<n;i++){  
            scanf("%s",mz\[i\]);  
            for(int j=0;j<n;j++){  
                if(isalpha(mz\[i\]\[j\])){  
                    kx\[mz\[i\]\[j\]-'A'\]=j;  
                    ky\[mz\[i\]\[j\]-'A'\]=i;  
                    h++;  
                }  
            }  
        }  
        printf("Case %d: ",++ff);  
        solve();  
    }  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
}  

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.