题目如下:
在图中的九个点上,空出中间的点,其余的点上任意填入数字1到8;1的位置固定不动,然后移动其余的数字,使1到8顺时针从小到大排列.移动的规律是:只能将数字沿线移向空白的点.请编程显示数字移动过程。
最近一直在做题,因为要参加一个考试了,所以每次做出来的题都写写博客,记录一下,或者也可以帮助到学习的同学。我再次感到自己菜到不得了,没看到高手的时候就以为自己是高手,见到高手的时候发现自己什么都不是,一直学习,不断学习,哪个行业都一样。所以学编程的同学们,加油了,一起学习。
我分析一下:
上面图的8个圈可以用数组表示就可以,用链表什么也可以,其实个人觉得数组就可以了,而且处理简单。嗯,首先用一个数组作为这8个圈,中间的圈用一个整形变量就可以。因为1的位置固定不动,先把1的位置找出来,然后2到8循环处理。for2-8,例如找2的时候,先判断2是否在1的后面,也就是数组的下一个数字是否是2,假如是2就continue处理下一个,假如不是,用中间变量保存数字2,然后之前的数字逐个向后移动,移动完将中间变量的2移动到对应的位置上。这里有个问题就是数组边界的问题,简单处理一下就可以了,超过7就从0开始。
- public class Test100 {
- public static void main(String[] args) {
- /**
- * 假如arr为图中的环形的圈,数组是圈内数字
- * 变量em为图中间的圈
- */
- // int[] arr = {8, 2, 1, 5, 3, 6, 4, 7} ;
- int[] arr = {5, 2, 3, 1, 8, 6, 4, 7} ; // 当前填充的数组
- int em ; // em为中间的圈等于要下一个要处理的数字
- int sum = 0 ; // 一共的移动次数
- int index1 = 0 ; // 数字1的数组下标
- for(int i = 0; i < 8; i++) { // 查找数字1的下标
- if(arr[i] == 1) {
- index1 = i ;
- }
- }
- // System.out.println("index1: " + index1) ;
- int t = 0 ; // 下一个要处理的数的下标
- int indexN = 0 ; // 下一个数的当前位置
- for(int n = 2; n <= 8; n++) { // 从2到8一个个找,
- t = index1+n-1 > 7 ? index1+n-1 - 8 : index1+n-1 ; // 找下一个的座标是哪里
- if(arr[t] == n) // 假如下一个数是下一个座标的位置上,跳过不用处理
- continue ;
- for(int j = 0; j < 8; j++) {
- if(arr[j] == n) {
- indexN = j ;
- break ;
- }
- }
- em = arr[indexN] ; // em为中间的圈等于要下一个要处理的数字
- System.out.println("数字" + arr[indexN] + "从" + indexN + "移动到" + "em") ;
- // System.out.println("下一个要处理的下标t :" + t + ", 下一个数的当前位置indexN :" + indexN + ", em :" + em) ;
- if(t > indexN) { // 下一个要处理的位置是否大于下一个数当前在的位置
- for(int k = indexN; k > 0; k--) {
- arr[k] = arr[k-1] ;
- sum++ ;
- System.out.println("数字" + arr[k-1] + "从" + (k-1) + "移动到" + k) ;
- }
- arr[0] = arr[7] ; // 过0处理,两个for
- System.out.println("数字" + arr[7] + "从" + 7 + "移动到" + 0) ;
- sum++ ;
- for(int k = 7; k > t; k--) {
- arr[k] = arr[k-1] ;
- System.out.println("数字" + arr[k-1] + "从" + (k-1) + "移动到" + k) ;
- sum++ ;
- }
- }else if(t < indexN) {
- for(int k = indexN; k > t; k--) {
- arr[k] = arr[k-1] ;
- System.out.println("数字" + arr[k-1] + "从" + (k-1) + "移动到" + k) ;
- sum++ ;
- }
- }
- arr[t] = em ;
- System.out.println("数字" + em + "从" + "em" + "移动到" + t) ;
- sum++ ;
- for(int i : arr) {
- System.out.print(i + ", ") ;
- }
- System.out.println() ;
- }
- System.out.println("移动次数:" + sum) ;
- }
- }
其实我个人觉得这个题就是数组的越界回0处理,没有什么特别的。只是实现起来会有些纠结,其他别太多算法要想的
总体来讲,还是比较简单的。