2017 JUST Programming Contest 3.0 I. Move Between Numbers
来源:互联网 发布:playclub捏脸详细数据 编辑:程序博客网 时间:2024/06/06 20:45
You are given n magical numbers a1, a2, ..., an, such that the length of each of these numbers is 20 digits.
You can move from the ith number to the jth number, if the number of common digits between ai and aj is exactly 17 digits.
The number of common digits between two numbers x and y is computed is follow:
Where countXi is the frequency of the ith digit in the number x, and countYi is the frequency of the ith digit in the number y.
You are given two integers s and e, your task is to find the minimum numbers of moves you need to do, in order to finish at number aestarting from number as.
The first line contains an integer T (1 ≤ T ≤ 250), where T is the number of test cases.
The first line of each test case contains three integers n, s, and e (1 ≤ n ≤ 250) (1 ≤ s, e ≤ n), where n is the number of magical numbers, s is the index of the number to start from it, and e is the index of the number to finish at it.
Then n lines follow, giving the magical numbers. All numbers consisting of digits, and with length of 20 digits. Leading zeros are allowed.
For each test case, print a single line containing the minimum numbers of moves you need to do, in order to finish at number ae starting from number as. If there is no answer, print -1.
15 1 51111119111119111191111181111111111818111118111718171711811111111111616111161118111751717818314111118
3
In the first test case, you can move from a1 to a2, from a2 to a3, and from a3 to a5. So, the minimum number of moves is 3 moves.
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>using namespace std;#define ll long longconst int maxn = 255;int n;int e[maxn][maxn];const int inf = 99999999;void initial() {int i, j;for (i = 1; i < maxn; ++i) {for (j = 1; j < maxn; ++j) {if (i == j) {e[i][j] = 0;}else {e[i][j] = inf;}}}}/***floyd算法*/void floyd() {int i, j, k;for (k = 1; k <= n; ++k) {//遍历所有的中间点for (i = 1; i <= n; ++i) {//遍历所有的起点for (j = 1; j <= n; ++j) {//遍历所有的终点if (e[i][j] > e[i][k] + e[k][j]) {//如果当前i-->j的距离大于i-->k--->j的距离之和e[i][j] = e[i][k] + e[k][j];//更新从i--->j的最短路径}}}}}int num[maxn][12];char s[25];void init(int i){ for(int k=0;k<20;k++) num[i][s[k]-'0']++;}int main(){// freopen("in.txt","r",stdin); int T,x,y,i,j,k; scanf("%d",&T); while(T--) { initial(); memset(num,0,sizeof(num)); scanf("%d%d%d",&n,&x,&y); for(i=1;i<=n;i++) { scanf("%s",&s); init(i); } for(i=1;i<n;i++) for(j=i+1;j<=n;j++) { int com=0; for(k=0;k<=9;k++) { com+=min(num[i][k],num[j][k]); } if(com==17) {//加边 e[i][j] = 1; e[j][i] = 1;// cout<<i<<" "<<j<<endl; } } floyd(); if(e[x][y]==inf) printf("-1\n"); else printf("%d\n",e[x][y]); //通过x,y来计算最短路径 }}
- 2017 JUST Programming Contest 3.0 I. Move Between Numbers
- 2017 JUST Programming Contest 3.0
- 2017 JUST Programming Contest 4.0
- 2017 JUST Programming Contest 3.0 E. The Architect Omar
- 2017 JUST Programming Contest 3.0 K. Malek and Summer Semester
- 2017 JUST Programming Contest 3.0 H. Eyad and Math
- 2017 JUST Programming Contest 3.0 D. Dice Game
- 2017 JUST Programming Contest 3.0 B. Linear Algebra Test
- 2017 JUST Programming Contest 2.0【solved:11 / 11】
- 2017 ACM Jordanian Collegiate Programming Contest I(Counting Votes-特征值)
- 2017 Wuhan University Programming Contest 现场赛I: A simple math problem(矩阵快速幂)
- 2017 Wuhan University Programming Contest 现场赛 I.A simple math problem(矩阵快速幂)
- Just move in!
- 2017 Wuhan University Programming Contest 题解
- 2017 ACM Amman Collegiate Programming Contest
- 2017 ACM Amman Collegiate Programming Contest J
- GYM 2017 ACM Amman Collegiate Programming Contest
- Nordic Collegiate Programming Contest 2017 题解
- python的io 与java的io流的使用及对象的序列化
- STM32串口下载
- C++ 头文件algorithm 1——partition
- 1、面向对象的解释
- Tour HDU
- 2017 JUST Programming Contest 3.0 I. Move Between Numbers
- ARC081 E
- CCI(2)-- Arrays and Strings
- 第一次
- linux
- jupyter notebook的安装与使用
- Java——值传递
- 2. OpenMAX系列 —— SoftOMXPlugin
- xml和Json的优缺点