刷了好久奇奇怪怪的数学题,终于有一道正常的图论题了,好激动啊。。。。
如果 colormap[i][j] 为'Y',要使狼能在某天,从 i 颜色变为 j 颜色,那么 colormap[i][0]~colormap[i][j-1] 间,有多少个‘Y’,那么 i 到 j 的边权值就是多少。
如果 colormap[i][j] 为'N',则为正无穷大。
然后求起点到终点的最短路径就行。因为数据范围很小,直接floyd就可以了。
#include<bits/stdc++.h>
using namespace std;
int dis[55][55];
int main()
{
int T,i,j,k,n,tmp;
char ch;
cin>>T;
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
tmp=0;
for(j=0;j<n;j++)
{
scanf(" %c",&ch);
if(ch=='Y')
{
dis[i][j]=tmp;
tmp++;
}
else
dis[i][j]=1<<29;
}
}
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
if(dis[0][n-1]==(1<<29))
printf("-1\n");
else
printf("%d\n",dis[0][n-1]);
}
}