导航菜单
首页 >  csp真题题解第29次  > 第三十五次CCF

第三十五次CCF

 解题方法:记录从1到max(m)的查询结果,再根据查询输出

注:题目在文末

我的题解:

import java.io.BufferedInputStream;import java.util.Scanner;public class Main2 {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));char[] cs = sc.nextLine().toCharArray();//定义并输入原始的字符串int len = cs.length;//原始字符串长度(包括前后两个‘#’)int[] css = new int[len];//在后续循环的时候,判断该字符串某位置是否有变动int n = sc.nextInt();//字符对个数char[] cc = sc.nextLine().toCharArray();//消除一个按行输入char[][] c = new char[n][4];//定义字符对数组for (int i = 0;i < n;i++) {//输入字符对c[i] = sc.nextLine().toCharArray();}int m;//定义查询个数m = sc.nextInt();//输入查询个数int[] k = new int[m];//定义m个查询的数组for (int i = 0;i < m;i++) {//输入m个查询k[i] = sc.nextInt(); }int max = 0;//定义max找到查询的最大值(次数)for (int i = 0;i < m;i++) {//找到maxmax = Math.max(max, k[i]);}char[][] kk = new char[max][len];//定义一个数组记录从1-max的查询(变换)int ii = 0;//第几个变换while (max-- > 0) {//循环max次填充kk数组for (int i = 0;i < n;i++) {//用i循环遍历各个字符对for (int j = 0;j < len;j++) {//用j循环遍历原始字符串并更改(可能已经更新)if (css[j] == 0 && cs[j] == c[i][1]) {//如果第j+1个字符在for循环(i)里没有遍历过并且符合字符对变换则修改原始字符串并将css数组相应位置标为1cs[j] = c[i][2];css[j] = 1; }}}for (int i = 0;i < len;i++) {//遍历kk[i]数组,将更改后的原始字符串传入kk[i],并取消css标记kk[ii][i] = cs[i]; css[i] = 0; }ii++;//变换次数加一}for (int i = 0;i < mm;i++) {//根据之前的查询数组输出查询结果int x = k[i];for (int j = 0;j < len;j++) {System.out.print(kk[x - 1][j]);}System.out.println();}}}

解题注意:当字符串的某个位置在本次变换中前面的字符对遍历过了,本次变换应该保持不变;同时,题目没有说查询保证顺序或递增,因此需要用到记录的方法

题目:

 

 

相关推荐: