#include #include #include #include #define MN 5001 #define INF 10000000 using namespace std; int H; int N; list Graf[MN]; char Map[MN]; int Odlg[MN][MN]; int OdlgOP[4][MN]; int OdlgOO[4][4]; void BFS(int Y) { queue Kol; Kol.push(Y); Odlg[Y][Y] = 0; while (!Kol.empty()) { int X = Kol.front(); Kol.pop(); for (list::iterator j=Graf[X].begin();j!=Graf[X].end();j++) { if (Odlg[Y][*j] == INF) { Odlg[Y][*j] = Odlg[Y][X]+1; Kol.push(*j); } } } } void OdlgDoOb(int Y) { queue Kol; for (int i=0;i::iterator j=Graf[X].begin();j!=Graf[X].end();j++) { if (OdlgOP[Y][*j] == INF) { OdlgOP[Y][*j] = OdlgOP[Y][X]+1; if (Map[*j] != '.') OdlgOO[Y][Map[*j]-'A'] = min(OdlgOO[Y][Map[*j]-'A'],OdlgOP[Y][*j]); Kol.push(*j); } } } } int main() { while (true) { scanf("%d",&H); if (H==0) break; N=0; for (int i=0;i=0;i--) { for (int j=0;j0) { Graf[N].push_back(N-1); Graf[N-1].push_back(N); } if (j>0 && i>0)// N-H-i-2; { Graf[N].push_back(N-H-(i-1)-1); Graf[N-H-(i-1)-1].push_back(N); } if (j0)// N-H-i-1; { Graf[N].push_back(N-H-(i-1)); Graf[N-H-(i-1)].push_back(N); } N++; // printf("%d %d %d\n",N,i,j); } } for (int i=H-2;i>=0;i--) { for (int j=0;j0) { Graf[N].push_back(N-1); Graf[N-1].push_back(N); } Graf[N].push_back(N-H-i-1); Graf[N-H-i-1].push_back(N); Graf[N].push_back(N-H-i); Graf[N-H-i].push_back(N); N++; } } for (int i=0;i 0) Odlg[i][j]--; for (int j=0;j<4;j++) // if (OdlgOP[j][i] > 0) OdlgOP[j][i]--; } for (int i=0;i<4;i++) for (int j=0;j<4;j++) // if (OdlgOO[i][j] > 0) OdlgOO[i][j]--; // for (int i=0;i<4;i++) // for (int j=0;j<4;j++) // printf("%d %d: %d\n",i,j,OdlgOO[i][j]); /*1*/ int Best = INF; for (int i=0;i::iterator j=Graf[i].begin();j!=Graf[i].end();j++) // printf("%d ",*j); // printf("\n"); // } } return 0; }