1. 程式人生 > 其它 >Codeforces #753 A. Linear Keyboard解題 自我思路

Codeforces #753 A. Linear Keyboard解題 自我思路

原題連結:Problem - A - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/contest/1607/problem/A

題目大意:

給定一個特殊的只有一行的鍵盤,每一步只能移動一個鍵位 (可以同時完成移動和敲擊按鍵的動作),給定一個只有小寫字母構成的字串,輸出 要輸出該字串所需要的最少步數

輸入的格式:

輸入 t 代表有 t 組實驗資料

隨後輸入 2t 行資料

第一行為 鍵盤的格式

下一行為給出的字串

例如:

5
abcdefghijklmnopqrstuvwxyz
hello
abcdefghijklmnopqrstuvwxyz
i
abcdefghijklmnopqrstuvwxyz
codeforces
qwertyuiopasdfghjklzxcvbnm
qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
qwertyuiopasdfghjklzxcvbnm
abacaba

輸出的格式:

接上面的例子

13
0
68
0
74

思路展示:

首先定義出 int 的 t

製造FOR迴圈來滿足題目多組輸入的要求

int main (){
	int t,j,k,i;
	scanf("%d",&t);
	for(i = 0;i<t;i++)

然後以:“abcdefghijklmnopqrstuvwxyz“ 為例

創造兩個 char型別的陣列,分別讀入鍵盤和目標字串

	char a[26],b[50];
	scanf("%s",&a);
	scanf("%s",&b);

隨後定義一個新的陣列,長度與 b 陣列相同,用來記錄 b 數組裡的字元在 a 陣列的下標

實現程式碼如下:

	m=strlen(b);
	int c[m];
	
	for(i=0;i<m;i++)
	{
		for(j=0;j<26;j++)
		{
		if(b[i]==a[j]) c[i]=j;	
		} 
	}	

然後利用 c 數組裡記錄的字元的地址來運算步數,最後相加(別忘了絕對值)

	int s=0;
	for(i=0;i<m-1;i++)
	{
		s=s+fabs(c[i+1]-c[i]);
	}
	

整體程式碼如下:

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	int i,m,j,t,q;
	scanf("%d",&t);
	for(q=0;q<t;q++){
		
	char a[26],b[50];
	scanf("%s",&a);
	scanf("%s",&b);
	
	m=strlen(b);
	int c[m];
	
	for(i=0;i<m;i++)
	{
		for(j=0;j<26;j++)
		{
		if(b[i]==a[j]) c[i]=j;	
		} 
	}	
	
	int s=0;
	for(i=0;i<m-1;i++)
	{
		s=s+fabs(c[i+1]-c[i]);
	}
	
	printf("%d\n",s);
}
}