本帖最后由 戴振良 于 2013-5-6 19:23 编辑
李德全 发表于 2013-5-5 23:26
恩恩,一类题。
想想我也写了一下,呵呵,不懂高级方法哈,计算机自动算没有加,先睡觉啦。 ...
懂C语言的写出的代码就是简洁啊,哎,是我把问题想复杂了。 我把9宫格里的9个图形,每一个图形都当成一个对象处理,一个图形对象中有形状属性(*、O),它还有自己所处的位置(x,y),还有它要对应一个1~9的数字(num),这是否算是面向对象编程啊?
说说我的思路吧:
1、定义一个图形对象,它有形状、位置、数字属性,还有切换形状的方法
2、new出9个图形对象存放于图形对象数组中,初始化他们的形状属性时是随机的,并且已经初始化好它们的位置与对应的数字
3、从命令行接收一个数字,并从图形数组中找出数字属性相同的图形对象
4、从找到的对象中获取x、y坐标,分别在4个方向进行加1与减1的操作,这样就得到了与它相邻的形状对象,调用这些对象的切换形状方向即可。- import java.util.Random;
- public class Demo9 {
-
- /** 形状类 */
- static class Shape {
-
- char shape; // 用于保存 * 或 O
- int num; // 用于标识自己对应的数字(1~9)
- int y, x; // 用于标识自己在数组中的位置
-
- /** 初始化时给定一个形状、一个数字 和 位置*/
- public Shape(char shape,int num, int y, int x) {
- this.shape = shape;
- this.num = num;
- this.y = y;
- this.x = x;
- }
-
- public void swapShape() { shape = shape=='*' ? 'O' : '*'; } //交换形状
- }
-
- /** 数组角标的长度 */
- public static int index_length = 3;
-
- public static void main(String[] args) {
- Shape[][] shapeArray = getRandomShapeArray(); // 获取一个随机图形数组
- showShapeArray(shapeArray); // 显示图形数组
- System.out.println("请输入1~9之间的数字,并按回车,退出请按0");
- while(true) {
- int num=0;
- try{num = System.in.read();}catch(Exception e){e.printStackTrace();}
- switch(num) {
- case '\r':
- case '\n': break;
- case '0': System.exit(0); break;
- default:
- num = num-'0';
- if(num>9 || num<=0) System.out.println("请输入1~9之间的数字,退出请输入0");
- else {
- Shape shape = findShape(shapeArray, num); // 查找出输入的数字对应哪个数组中的哪个图形
- shapeArray = changeShapeArray(shapeArray, shape); // 把这个图与它相龄的图形都改变形状
- System.out.println();
- showShapeArray(shapeArray); // 显示改变后的图形数组
- System.out.print("-------------------");
- }
- }
- }
- }
-
- /**
- * 获取一个随机形状数组
- * @return Shape数组
- */
- static Shape[][] getRandomShapeArray() {
- Shape[][] shapeArray = new Shape[index_length][index_length];// 初始化一个3×3的图形数组
- Random mRandom = new Random(); // 初始化一个随机对象
- for(int y=0, position=1; y<index_length; y++)
- for(int x=0; x<index_length; x++) {
- char ch = mRandom.nextBoolean() ? 'O' : '*';
- shapeArray[y][x] = new Shape(ch, position++, y, x);
- }
- return shapeArray;
- }
-
- /**
- * 显示形状数组
- * @param shapeArray 要显示的形状数组
- */
- static void showShapeArray(Shape[][] shapeArray) {
- for(int y=0,len=shapeArray.length; y<len; y++)
- for(int x=0; x<len; x++)
- if(x == len-1) System.out.print(shapeArray[y][x].shape + "\n\n");
- else System.out.print(shapeArray[y][x].shape + "\t");
- }
-
- /**
- * 找出给定数字所对应的图形对象
- * @param shapeArray 形状数组
- * @param num 指定要在形状数组中查找的数字
- * @return Shape对象
- */
- static Shape findShape(Shape[][] shapeArray ,int num) {
- Shape shpae = null;
- for(int y=0,len=shapeArray.length; y<len; y++)
- for(int x=0; x<len; x++)
- if(shapeArray[y][x].num == num) shpae = shapeArray[y][x];
- return shpae;
- }
-
- /**
- * 改变图形数组中指定图形形状,并且也改变与它相邻的Shape对象的形状
- * @param shapeArray 要改变的数组
- * @param shape 指定的图形对象
- * @return 改变形状后的数组
- */
- static Shape[][] changeShapeArray(Shape[][] shapeArray, Shape shape) {
- int y = shape.y, x = shape.x;
- shapeArray[y][x].swapShape();
- if(y-1 >= 0) shapeArray[y-1][x].swapShape();
- if(x-1 >= 0) shapeArray[y][x-1].swapShape();
- if(y+1 < index_length) shapeArray[y+1][x].swapShape();
- if(x+1 < index_length) shapeArray[y][x+1].swapShape();
- return shapeArray;
- }
- }
复制代码 图形的切换是实现了,就是要计算出最少步骤的翻转成统一图形这个我就没思路了,不说最少步骤,就是让我把它玩统一了也难,除非我在代码里搞个外挂^_^
|