zoj 1221 Risk Flory
博客开了快半年了- -学习编程也快1年半了,觉得空空的不太好看,刚好最近开始练习ACM了,就来做一个简单的ACM学习笔记吧,纪念的第一题zol 1221 Risk 风险游戏(个人觉得是这样翻- -翻译错了的话,别打脸就行)。
题目简述,一个20个国家,玩家每次只能从攻击相邻的国家,计算I国家攻击J国家最少要攻击的国家数(渣翻莫怪)。
输入: 前19行为地图设定,每行第一个数字为第I个国家相邻的国家数(该数目只往前数不后数),后面的n个数字为国家编号,然后是需要计算的次数N,之后就是N行2个数字的需计算国家编号。
输出:相信输出直接看题就可以了- -我就不翻了。注意一点。。该游戏是可以无限循环的,输出的第一行“Test Set #T“ T是不断增加的,还有就是每一次游戏结束都要空一行才能进行下一场游戏(因为这坑爹的原因我PE了10多次啊(ノ=Д=)ノ┻━┻)。不说了贴代码。
import java.util.*; public class Main { public static void main(String arg[]){ Scanner scan = new Scanner(System.in); int[][] country = new int[20][20]; int T= 1; while(scan.hasNext()){ SetMap(country,scan); Floyd(country); int rtime=scan.nextInt(); System.out.println("Test Set #"+T++); while(rtime-->0){ int Fc=scan.nextInt(); int Sc=scan.nextInt(); System.out.println(Fc+" to "+Sc+": "+country[Fc-1][Sc-1]); } System.out.print("\n"); } } public static void SetMap(int country[][],Scanner scan){ for(int i=0;i<20;i++){ for(int j=0;j<country[i].length;j++){ /*country[i][j]=Integer.MAX_VALUE;*/ country[i][j]=32767; } } for(int i=0;i<19;i++){ int sob=scan.nextInt(); //borders counrty counts for(int j=sob;j>0;j--){ int any=scan.nextInt(); country[i][any-1]=1; country[any-1][i]=1; } } } public static void Floyd(int [][]d){ int k,l,m,o; for(k=0;k<20;k++){ for(l=0;l<20;l++){ for(m=0;m<20;m++){ if(l!=m){ if(d[l][m]>(d[l][k]+d[k][m])){ d[l][m]=d[l][k]+d[k][m]; d[m][l]=d[l][m]; } }else{ d[l][m]=d[m][l]=0; } } } } } }
代码有误的或有更好的写法请指出,菜鸟的我会认真改过的(→_←),感谢阅读。