#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<vector>
#include<string.h>
#include<map>
#include<cmath>
#include<queue>
#define ll long long
#define INF 0x7fffffff
#define MAX 0x3f3f3f3f
#define maxn 1000005
#define ull unsigned long long
using namespace std;
char f[55][55];
int n,p1,p2,p3;
bool v[55][55][55];
struct node
{
int x,y,z,step;
};
void bfs()
{
queue<node> q;
node a,b;
a.x=p1;a.y=p2;a.z=p3;a.step=0;//结构体a,b,c记得是三点位置
v[p1][p2][p3]=1;//标记走过
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
if(a.x==a.y&&a.y==a.z)//三点到达同一位置
{
printf("%d\n",a.step);return;
}
for(int i=1;i<=n;i++)
{
b=a;
if(f[b.x][i]==f[b.y][b.z]&&!v[i][b.y][b.z])//两条路颜色一样
{
b.step++;
b.x=i;//可以走
v[b.x][b.y][b.z]=1;
q.push(b);
}
}
for(int i=1;i<=n;i++)
{
b=a;//还原a,然后判断一圈
if(f[b.y][i]==f[b.x][b.z]&&!v[b.x][i][b.z])
{
b.step++;
b.y=i;
v[b.x][b.y][b.z]=1;
q.push(b);
}
}
for(int i=1;i<=n;i++)
{
b=a;
if(f[b.z][i]==f[b.x][b.y]&&!v[b.x][b.y][i])
{
b.step++;
b.z=i;
v[b.x][b.y][b.z]=1;
q.push(b);
}
}
}
printf("impossible\n");
return ;
}
int main()
{
int i,j,num;
char s[2];
while(~scanf("%d",&n)&&n)
{
memset(v,0,sizeof(v));
scanf("%d%d%d",&p1,&p2,&p3);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%s",s);//矩阵由空格分隔的小写字母组成
f[i][j]=s[0];
}
bfs();
}
return 0;
}
无向图形上三点的有规则限制的移动,
二维数组存两点之间颜色
读取空格分隔的矩阵
三维数组
函数里可以用printf
答案可能是0