poj日记(1222)
来源:互联网 发布:中国保险网络大学 编辑:程序博客网 时间:2024/06/10 14:35
import java.util.Scanner; public class Main{ /*解题思路 * * 1.时钟的状态只有四种(分别对应0.1.2.3),那么顺时针旋转90° * 就是clock_time = (clock_time+1)%4,九个时钟就用一个 * 数组表示它们的状态。 * 2.同时每一种操作都有周期性限制,也即最多需要几次操作,多于这个 * 次数产生循环。本题中,操作的最多次数为3,如果操作四次,则和没有 * 操作是一样的..故用一个数组表示九个操作每个操作需要进行的次数。 * 3.对移动方法进行枚举,枚举方法123,共64种情况,则A的状态只 * 能通过操作4来改变,所以要A达到十二点,那么操作4的次数是一定的了。 * 同理,改变B只能操作5,改变C只能操作6。那么操作123456的次数确定。 * 4.这时候,同理改编D只能操作7,改编F只能操作9,所以12345679确定。 * 5.这时候还剩EGHI还没确定,操作8还没确定。由于操作8只能同时改编GHI, * 不改变E,那么看看E是否已经到达十二点,看看GHI是否相同。 * */ static private int[] clock_time; //时钟初始状态 static private int[] enumeration; //用于枚举123操作,初始000 static private int min_time = 28; //记录当前最少序列 static private int[] min_seq; //9种操作 static private int [][] op = new int[][]{ //A B C D E F G H I {1,1,0,1,1,0,0,0,0}, //op1:ABDE {1,1,1,0,0,0,0,0,0}, //op2:ABC {0,1,1,0,1,1,0,0,0}, //op3:BCEF {1,0,0,1,0,0,1,0,0}, //op4:ADG {0,1,0,1,1,1,0,1,0}, //op5:BDEFH {0,0,1,0,0,1,0,0,1}, //op6:CFI {0,0,0,1,1,0,1,1,0}, //op7:DEGH {0,0,0,0,0,0,1,1,1}, //op8:GHI {0,0,0,0,1,1,0,1,1} //op9:EFHI }; static private void input(){ Scanner sc = new Scanner(System.in); clock_time = new int[9]; for(int i = 0; i < 9; i++){ clock_time[i] = sc.nextInt(); } } //枚举操作123的不同次数,每次枚举都+1 static private void enumerate(){ enumeration[0]++; if(enumeration[0] == 4){ enumeration[1]++; enumeration[0] = 0; } if(enumeration[1] == 4){ enumeration[2]++; enumeration[1] = 0; } } //由一种枚举状态,确定此状态能否达成要求,若达到要求,返回总的操作次数,达不到要求,返回28次 //1.确定123的操作次数(已经得到) //2.施加123操作给所有时钟,得到ABC的状态,从而确定456的操作次数 //3.施加456操作给所有时钟,得到DF的状态,从而确定79的操作次数 //4.施加79操作给所有时钟,得到EGHI的状态 //5.判断GHI是否相同,E是否达到12点,若其一条件不满足,则返回28次 //6.如果满足,确定8操作的次数。输出所有操作,根据次数确定该操作重复输出的次数 public static void guess(int []enumeration){ // System.out.println("本次枚举:"); // for(int i = 0; i < 3; i++){ // System.out.print(enumeration[i] + " "); // } // System.out.println(); //临时记录状态的时钟 int [] t = new int[9]; for(int i = 0; i<9;i++){ t[i] = clock_time[i]; } //每种操作执行的次数 int [] opn = new int[9]; opn[0] = enumeration[0]; opn[1] = enumeration[1]; opn[2] = enumeration[2]; //施加123操作给所有时钟 for(int i = 0; i < 3; i++){ for(int j = 0; j < 9; j++){ t[j] = (t[j] + opn[i] * op[i][j])%4; } } // System.out.println("施加操作123后:"); // for(int j = 0; j < 9; j++){ // System.out.print(t[j] + " "); // } // System.out.println(); //通过ABC的状态,得到456的操作次数 opn[3] = (4 - t[0]) % 4; opn[4] = (4 - t[1]) % 4; opn[5] = (4 - t[2]) % 4; //施加456操作给所有时钟 for(int i = 3; i < 6; i++){ for(int j = 0; j < 9; j++){ t[j] = (t[j] + opn[i] * op[i][j])%4; } } // System.out.println("施加操作456后:"); // for(int j = 0; j < 9; j++){ // System.out.print(t[j] + " "); // } // System.out.println(); //通过DF,确定79的操作次数 opn[6] = (4 - t[3]) % 4; opn[8] = (4 - t[5]) % 4; //施加79操作给所有时钟 for(int i = 6; i <= 8; i++){ if(i == 7) continue; for(int j = 0; j < 9; j++){ t[j] = (t[j] + opn[i] * op[i][j])%4; } } // System.out.println("施加操作79后:"); // for(int j = 0; j < 9; j++){ // System.out.print(t[j] + " "); // } // System.out.println(); //判断 if(t[4] != 0 || t[6] != t[7] || t[7] != t[8]) { // System.out.println("本次不满足条件"); return; } //计算操作8 opn[7] = (4 - t[6]) % 4; // System.out.println("本次操作序列:"); int sum = 0; for(int i = 0; i < 9; i++){ sum += opn[i]; } if(sum < min_time){ min_seq = opn; } else return; } public static void main(String[] args) { input(); enumeration = new int[3]; //自动初始化000 for(int i = 0; i < 64;i++){ guess(enumeration); enumerate(); } for(int i = 0; i < 9; i++){ for(int j = 0; j < min_seq[i]; j++){ System.out.print(i + 1 + " "); } } } }
阅读全文
0 0
- poj日记(1222)
- poj日记(1001)
- poj日记(1753)
- poj日记(1003)
- poj日记(1004)
- poj日记(3299)
- poj日记(1005)
- poj日记(1328)
- poj日记(3295)
- poj日记(1207)
- poj日记(1936)
- poj日记(1860)
- poj日记(2632)
- poj日记(2965)java
- poj日记(2586)java
- poj日记(1017)——贪心算法
- 汉城日记(一)
- 创业日记(转贴)
- hashmap的遍历最优方式
- 集成算法系列之GBM
- android 扫描二维码 生产二维码
- docker环境搭建
- 第十四周项目二
- poj日记(1222)
- 关于Android蓝牙连接问题总结
- java.lang.StackOverflowError 解决办法
- HTTP cookies 详解
- 第十三周——项目一—验证算法(3)验证二叉排序树相关算法
- regflag linux 重启nfs问题及解决
- android资料查看插件
- 解决redis-cli command not found问题
- tail -f 实时查看日志文件