原标题:Java的爱情:巩固控制和循环语句
【耿祥义老师教你:巩固控制和循环语句】
基本语句,像控制语句、循环语句等,和C语言非常类似(基本语句的训练属于第一门语言,比如C语言负责的任务)。学习Java时只需注意Java和C的不同之处即可,例如条件表达式的值必须是boolean类型等。这个文章的主要出发点是给那些初学Java,刚刚学完前3章的学生看的,其目的就是激发兴趣和巩固一下知识。但也适合适合任何学习过Java语言的学生浏览。
故事导入:英雄救美
巫婆把男孩的心意女孩藏到了纵横交错、高度各不相同的群山中的一座最高山上。
神仙告诉男孩一个救回女孩的办法,神仙对男孩说,‘你从一座山做出发点,首先看当前山的 东西南北方向的山,因为巫婆的巫术使得你无法看见更远的山。然后,在其中找一座最高的山爬上去...每爬一座山别忘记留下标记,即记住自己曾爬过此山。也许某个时候,你会发现当前山的东西南北方向的山都是曾爬过的山了。
这个时候,你按着曾留下的标记,一步一步的退回,一直退到曾爬过的某个山,发现此座山的东西南北方向的山中,除了曾爬过的山以外,还有没爬过的山,那么就在这些山中再选一座高山去爬...如此循环往复。只要无畏艰险,你一定能救回你心意的女孩’。
男孩相信了神仙的话( 方法正确),最终救回了心意的女孩( 正确的方法作正确的事)。
程序效果图
每次运行程序,刻画纵横交错、高度各不相同的二维数组的元素的值都有变化,因此每次运行效果不尽相同。效果图的中的 圆圈是男孩寻觅的起点, 实心三角是男孩寻觅过程中曾爬过的山,空心三角是不曾爬过的山, 实心五角星是女孩所在的山。
源代码讲解
(耿祥义视频讲解)
源代码分享与下载
微信中显示区域太小,导致源代码出现很多不必要的回行.
如果觉得显示的SaveTheGirl.java源代码不利于阅读,单击阅读原文下载源代码。
//代码中打◆号注释的不要求看懂,等学完java集合框架就看懂了
//本代码主要目的是训练初学者学习控制语句和循环语句(耿祥义java老师,-3-8)
import java.util.ArrayList;
import java.util.Stack;
import java.util.Collections;
public class SaveTheGirl {
public static void main(String args[]) {
Stack saveI = new Stack ;//◆存放走过的山的索引坐标i
Stack saveJ = new Stack ;//◆存放走过的山的索引坐标j
ArrayList list = new ArrayList; //◆存放整数的数组表
int row = 10;//数组的行数
int column = 20; //数组的列数
for(int i=1;i<=row*column;i++) { //把1-row*column个数放入链表
list.add(i);
}
Collections.shuffle(list);//◆打乱数组表,即洗牌。
int [][] a = new int[row][column];//二位数组,刻画纵横交错的山
int index = 0;
for(int i = 0;i
for(int j = 0;j
a[i][j] = list.get(index); //得到数组表的第index个节点的值,设置山的高度
index++;
}
}
a[0][0] = 0; //男孩寻觅的起点
int MAX = row*column ; //最高的山的高度(要找的数据)
int posionX = 0;
int posionY =0; //将来存放找到的女孩(数据)的位置
//以下是男孩寻觅的过程,只要a[i][j]的值被设置成0,就表示a[i][j]是男孩爬过的山。
int max = -1;
int i = 0;
int j = 0;
int m =0,n =0;
while(true){
saveI.push(i); //记下爬过的山的位置(压栈)
saveJ.push(j); //记下爬过的山的位置
boolean boo = // 判断东西南北周围的山是否都爬过了啊!
a[i][j+1
a[i][j-1>0?j-1:0]==0&& //判断是否爬过西山
a[i+1
a[i-1>0?i-1:0][j]==0; //判断是否爬过北山
while(boo){ //假如a[i][j]的东西南北周围的山都爬过了
i= saveI.pop;
j = saveJ.pop; //退回一步。
boo =a[i+1
a[i-1>0?i-1:0][j]==0&&
a[i][j+1
a[i][j-1>0?j-1:0]==0;
//一直退到a[i][j]的东西南北周围的山中有没爬过的山
}
//这样就可以找一个东西南北中的高山爬:
if(i+1=max&&a[i+1][j]!=0){ //检查a[i][j]的北山的高度
m=i+1;
n =j; //保存该方向的索引到m,n中
max = a[i+1][j];
}
if(i-1>=0&&a[i-1][j]>max&&a[i-1][j]!=0){ //继续检查a[i][j]的南山的高度
m=i-1;
n =j; //保存该方向的索引到m,n中
max = a[i-1][j];
}
if(j+1max&&a[i][j+1]!=0){ //继续检查a[i][j]东山的高度
m=i;
n =j+1; //保存该方向的索引到m,n中
max = a[i][j+1];
}
if(j-1>=0&&a[i][j-1]>max&&a[i][j-1]!=0){ //继续检查a[i][j]的西山的高度
m=i;
n =j-1; //保存该方向的索引到m,n中
max = a[i][j-1];
}
if(max == MAX){
posionX = m;
posionY = n; //终于找到了女孩,记下位置
break ; //找到了,立刻停止循环
}
a[m][n] = 0;//没找到,将a[m][n]设置成爬过的山
i = m;
j = n;
max = -1;//走到a[m][n],继续找下一个路点
}
//以下输出男孩爬过的山和没爬过的山
for(int p=0;p
for(int q =0;q
if(a[p][q]==0) {
if(p==0&&q==0)
System.out.print("●");//男孩的起点
else
System.out.print("▲");//表示爬过的山
}
else {
if(a[p][q]==MAX)
System.out.print("★");//女孩的样子
else
System.out.print("△"); //没爬过山的
}
}
System.out.println;//输出回行
}
System.out.printf("n女孩的位置:%d,%d",posionX,posionY);//输出女孩所在山的位置索引
}
责任编辑: