51nod1445(最短路)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1445
题意: 中文题诶~
思路: 可以将每种颜色看作一个节点, 从一种颜色到另一种颜色的代价看作这两个节点之间的距离, 即 x 节点到 y 节点的距离为行号为 x 的行中 0 ~ y - 1 中的 Y 的数目. 然后再跑一遍最短路即可.
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 5 const int inf = 1e9; 6 const int MAXN = 60; 7 int mp[MAXN][MAXN]; 8 9 void floyd(int n){ 10 for(int k = 0; k < n; k++){ 11 for(int i = 0; i < n; i++){ 12 for(int j = 0; j < n; j++){ 13 mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]); 14 } 15 } 16 } 17 } 18 19 int main(void){ 20 char ch; 21 int t, n; 22 cin >> t; 23 while(t--){ 24 cin >> n; 25 for(int i = 0; i < n; i++){ 26 int cnt = 0; 27 for(int j = 0; j < n; j++){ 28 cin >> ch; 29 if(ch == 'Y') mp[i][j] = cnt, cnt++; 30 else mp[i][j] = inf; 31 } 32 } 33 floyd(n); 34 printf("%d\n", mp[0][n - 1] >= inf ? -1 : mp[0][n - 1]); 35 } 36 return 0; 37 }
我就是我,颜色不一样的烟火 --- geloutingyu