第六届蓝桥杯 软件类省赛真题 第八题:移动距离

移动距离


X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:


1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离(不能斜线方向移动)


输入为3个整数w m n,空格分开,都在1到10000范围内
要求输出一个整数,表示m n 两楼间最短移动距离。


例如:
用户输入:
6 8 2
则,程序应该输出:
4


再例如:
用户输入:
4 7 20
则,程序应该输出:
5


资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
======================================================
代码实现:
package com.aiqiongdiao;
import java.util.Scanner;


public class Main {
	public static void main(String[] args) {
//		1  2  3  4  5  6
//		12 11 10 9  8  7
//		13 14 15 .....
//		输入为3个整数w m n,空格分开,都在1到10000范围内
//		要求输出一个整数,表示m n 两楼间最短移动距离。
		Scanner num1 = new Scanner(System.in); 
		int a=0,b=0,c=0,count=1;
		int shu1i=0,shu1j=0,shu2i=0,shu2j=0,jishu=0,bushu=0;
		int shui=0,shuj=0;
		a=num1.nextInt();
		b=num1.nextInt();
		c=num1.nextInt();
		int d=(int)(10000/a);
		int n2[][] = new int [d][a];
		for(int i=0;i<n2.length;i++){
			if(i%2==1){
				for(int j=0;j<n2[i].length;j++){	
					n2[i][j]=count;
					count++;
				}		
			}
			else{
				for(int j=n2[i].length-1;j>=0;j--){
					n2[i][j]=count;
					count++;
				}
			}
		}
		for(int i=0;i<n2.length;i++){
			for(int j=0;j<n2[i].length;j++){			
				if(n2[i][j]==b){
					shu1i=i;
					shu1j=j;
					jishu++;
				}
				if(n2[i][j]==c){
					shu2i=i;
					shu2j=j;
					jishu++;
				}
			}
			if(jishu==2){
				break;	
			}
		}	
		if(shu1i>=shu2i){
			shui=shu1i-shu2i;
		}
		else{
			shui=shu2i-shu1i;
		}
		if(shu1j>=shu2j){
			shuj=shu1j-shu2j;
		}
		else{
			shuj=shu2j-shu1j;
		}	
		bushu = shui+shuj;	
		System.out.println(bushu);	
	}
}



===============================================
这段代码是我以前写的,可行,但是它并不规范,不好理解。
我对它进行优化改造!!!


代码优化后:
package com.aiqiongdiao;
import java.util.Scanner;


public class Main {
	/**
	 * 	1  2  3  4  5  6
		12 11 10 9  8  7
		13 14 15 .....
		输入为3个整数w m n,空格分开,都在1到10000范围内
		要求输出一个整数,表示m n 两楼间最短移动距离。
	 * @param args
	 */
	public static void fuzhi(int lou[][]){
		int count=1;   //起始楼房从1开始!!!!
		for(int i=0;i<lou.length;i++){
			if(i%2==1){  //根据奇数偶数进行不同方向的赋值
				for(int j=0;j<lou[i].length;j++){	
					lou[i][j]=count;
					count++;
				}		
			}
			else{
				for(int j=lou[i].length-1;j>=0;j--){
					lou[i][j]=count;
					count++;
				}
			}
		}
	}
	public static int bushu(int lou[][],int m,int n){
		int a=0;
		int b=0;
		int a1=0;
		int b1=0;
		for(int i=0;i<lou.length;i++){
			for(int j=0;j<lou[0].length;j++){
				if(lou[i][j]==m){   //获取两栋楼i j坐标
					a=i;
					b=j;
				}
				if(lou[i][j]==n){
					a1=i;
					b1=j;
				}
			}
		}
		a=a-a1;
		b=b-b1;
		return 	(gai(a)+gai(b));
	}
	
	public static int gai(int n){  //对负数改正
		if(n<0){
			n=-n;	
		}
		return n;
	}
	
	
	public static void main(String[] args) {
		Scanner num1 = new Scanner(System.in);    //获取数据
		int lie=num1.nextInt();   //输入列数
		int m=num1.nextInt();   //输入两栋楼
		int n=num1.nextInt();
		
		int hang=(int)(10000/lie);   //计算行数
		int lou[][] = new int [hang][lie];  //新建适当的数组
		fuzhi(lou);    //对数组进行赋值
		System.out.println(bushu(lou,m,n));
	}
}


=============================================================
但是我觉得这道题可以再简单一点,那就是用数学方法的计算。
试一试~


思路:
1.获取:3个数值
2.计算:将后面两个数值%前面那个数 得数a
3.计算:将后面两个数/前面的数 得数b
4.筛选:数b分奇偶,偶数a加负号
5.计算:数a,数b运算,修改负数情况,两结果相加




数学版代码:

package com.aiqiongdiao;
import java.util.Scanner;

public class Main {
	/**
	1.获取:3个数值
	2.计算:将后面两个数值%前面那个数 得数a
	3.计算:将后面两个数/前面的数 得数b
	4.筛选:数b分奇偶,偶数a加负号
	5.计算:数a,数b运算,修改负数情况,两结果相加
	 * @param args
	 */
	public static int jiSuan(int w,int m,int n){
		int a=0;
		int a1=0;
		a = m % w;
		a1= n % w;
		int b=0;
		int b1=0;
		b=jia(m,w);
		b1=jia(n,w);
		a=bian(b,a,w);
		a1=bian(b1,a1,w);
		a=a-a1;
		b=b-b1;
		return (gai(a)+gai(b));
	}
	public static int jia(int n,int w){
		int re=0;     //处于尾端不需要换行处理
		if(n%w!=0){     
			return re=n/w+1;
		}else{			
			return re=n/w;
		}
	}
	
	
	public static int bian(int n,int m,int w){
		if(n%2==0){
			m=w-(m-1);   //不包括0
		}
		return m;
	}
	public static int gai(int n){
		if(n<0){
			n=-n;
		}
		return n;
	}
	
	
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int w=input.nextInt();
		int m=input.nextInt();
		int n=input.nextInt();
		System.out.println(jiSuan(w,m,n));		
	}
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值