每组测试数据有相同的结构构成:
每组数据第一行一个整数N,2<=N<=50。
之后有N行,每行N个字符,表示狼的变色矩阵,矩阵中只有‘Y’与‘N’两种字符,第i行第j列的字符就是colormap i i j j。
3 3 NYN YNY NNN 8 NNNNNNNY NNNNYYYY YNNNNYYN NNNNNYYY YYYNNNNN YNYNYNYN NYNYNYNY YYYYYYYN 6 NYYYYN YNYYYN YYNYYN YYYNYN YYYYNN YYYYYN
1 0-1
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct node { int from; int to; int w; int next; }e[3000]; int cont; int n; int vis[51]; int dis[51]; int head[51]; char a[51][51]; void add(int from,int to,int w) { e[cont].to=to; e[cont].w=w; e[cont].next=head[from]; head[from]=cont++; } void SPFA() { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++)dis[i]=0x3f3f3f3f; dis[0]=0; vis[0]=1; queue<int >s; s.push(0); while(!s.empty()) { int u=s.front(); vis[u]=0; s.pop(); for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].to; int w=e[i].w; if(dis[v]>dis[u]+w) { dis[v]=dis[u]+w; if(vis[v]==0) { vis[v]=1; s.push(v); } } } } if(dis[n-1]==0x3f3f3f3f)printf("-1\n"); else printf("%d\n",dis[n-1]); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",a[i]); } cont=0; memset(head,-1,sizeof(head)); for(int i=0;i<n;i++) { int w=0; for(int j=0;j<n;j++) { if(a[i][j]=='Y') { add(i,j,w); w++; } } } SPFA(); } }
#include<cstdio> #include<cstring> using namespace std; const int inf=0x3f3f3f3f; int dis[51][51]; char str[51]; int main() { int t,n,ans; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(dis,inf,sizeof(dis)); for(int i=0; i<n; i++) { ans=0; scanf("%s",str); for(int j=0; j<n; j++) { if(str[j]=='Y') dis[i][j]=ans++; } } //printf("%d\n",dist[0][0]); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { for(int k=0; k<n; k++)//k作为中间节点可以放在第一层循环,也可以放在第三层循环,但是不能放在第二层循环 { if(dis[j][i]+dis[i][k]<dis[j][k]) dis[j][k]=dis[j][i]+dis[i][k]; } } } printf("%d\n",dis[0][n-1]==inf?-1:dis[0][n-1]); } return 0; }
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> #include <vector> #include <string> #include <cstring> using namespace std; const int inf = 0x3f3f3f3f; char val[55][55]; int minn_cnt; int n,test; int edge[55][55]; int vist[55], minidis[55]; void dijkstra() { int j, k; for(int i=1;i<=n;i++) minidis[i]=edge[1][i]; vist[1] = 1; minidis[1] = 0; for (j = 1; j <n; j++) { int min_value = inf, min_pos=0; for (k = 1; k <= n; k++) { //printf("sdfgs\n"); if (vist[k] == 0 && minidis[k] < min_value) { min_value = minidis[k]; min_pos = k; } } vist[min_pos] = 1; //position = min_pos; for (k = 1; k <= n; k++) { if (vist[k]==0&&edge[min_pos][k] != inf && minidis[min_pos] + edge[min_pos][k] < minidis[k])//新填入的点更新minidis { minidis[k]=minidis[min_pos]+edge[min_pos][k]; } } } } int main() { int i, k; cin >> test; while (test--) { cin >> n; for(i=1;i<=n;i++) { for(k=i;k<=n;k++) edge[i][k]=edge[k][i]=inf; } for (i = 1; i <= n; i++) { cin >> val[i] + 1; minn_cnt = 0; for (k = 1; k <= n; k++) { if (val[i][k] == 'Y') { edge[i][k] = minn_cnt; minn_cnt++; } } } fill(minidis,minidis+52,inf); memset(vist, 0, sizeof(vist)); dijkstra(); //printf("FHGFJH"); if (minidis[n]==inf) cout << -1 << endl; else cout << minidis[n] << endl; } return 0; }