POJ 3735 java实现

来源:互联网 发布:数据的有效性 编辑:程序博客网 时间:2024/06/07 06:48

POJ 3735 java实现

import java.util.Scanner;public class Main3735 {static boolean stringequal(String a, String b) {char[] s = a.toCharArray();char[] t = b.toCharArray();if (s.length != b.length()) {return false;}for (int i = 0; i < t.length; i++) {if (s[i] != t[i]) {return false;}}return true;}public static void main(String[] args) throws Exception {System.setIn(new java.io.FileInputStream("3735.txt"));Scanner sc = new Scanner(System.in);while (true) {int n = sc.nextInt();int m = sc.nextInt();int k = sc.nextInt();if (n == m && m == k && m == 0) {break;}long[][] petmatri = new long [2][n+2];petmatri[1][n+1]=1;long[][] basematri = new long[n + 2][n + 2];for (int i = 1; i < basematri.length; i++) {basematri[i][i] = 1;}long[][] init = new long[n + 2][n + 2];for (int i = 0; i < basematri.length; i++) {init[i][i] = 1;}int pettagi, pettagj;for (int i = 0; i < k; i++) {String get = sc.next();if (stringequal(get, "g")) {pettagi = sc.nextInt();basematri[n + 1][pettagi]++;} else if (stringequal(get, "s")) {pettagi = sc.nextInt();pettagj = sc.nextInt();long temp;for (int j = 1; j < basematri.length; j++) {temp = basematri[j][pettagi];basematri[j][pettagi] = basematri[j][pettagj];basematri[j][pettagj] = temp;}} else {pettagi = sc.nextInt();for (int j = 1; j < basematri.length; j++) {basematri[j][pettagi] = 0;}}}while (m != 0) {if ((m & 1) != 0)init=matricMultple(init, basematri);basematri = matricMultple(basematri, basematri);m >>= 1;}long[][] result = matricMultple(petmatri, init);for (int i = 1; i < result[0].length-1; i++) {System.out.print(result[1][i] + " ");}System.out.println();}}static long[][] matricMultple(long[][] a, long[][] b) {long[][] res = new long[a.length][b[0].length];//for (int i = 1; i < a.length; i++) {//for (int j = 1; j < b.length; j++) {//for (int j2 = 1; j2 < b[0].length; j2++) {//res[i][j] += a[i][j2] * b[j2][j];//}//}//}// 优化 前矩阵 的项值为零时,牵涉到此值的计算,全部忽略。for (int i = 1; i < a.length; i++) {for (int j = 0; j < a[0].length; j++) {if (a[i][j] != 0) {for (int j2 = 0; j2 < a[0].length; j2++) {res[i][j2] += a[i][j] * b[j][j2];}}}}return res;}}

原创粉丝点击