一.题目描述:
数字或字母可以用7位数码管显示(就是排列为8字形的7个数码管)
@@@@ ... 0
@ @ ... 1 2
@ @
@@@@ ... 3
@ @ ... 4 5
@ @
@@@@ ... 6
对于大型灯管,为了节约使用,在切换数字的时候,如果该灯管的状态没有改变,则不需要对该灯管关了再开。
已知一个数字变化的系列,求7个数码管开关的动作。
(1) 0,2,3,5,6
(2) 0,1,4,6,5,3
二.解题思路:
首先我们会想这9个数字在数码管上是如何显示的,然后会想要这9个数字之间是如何过渡的,可能是两个相邻数字之间的变化,也可能是不同数字之间的变化,如何才能够解决这个过渡的问题就是我们应该好好思考的。
我们知道将数码管开启的时候是所有的灯都先亮一下(即亮出8这个数字),然后才会变化到我们想要的数字的。而如何进行变化呢?我们就会想到如果想从一个数字变换到另一个数字,先要做的就是将该灭的灯先灭掉(即将对应显示的数字所不需要亮的灯给灭了,比如数字3,我们需要灭的登就是上图所对应的1号和4号位置),如果该灯本来就是灭的我们就不做任何操作,如果该灯是亮的则灭了他;然后要做的就是亮起我们需要亮的灯,道理同上面一样。
三.Java代码如下:
public class Test06 {
public static void main(String[] args) {
// String value = "02356"; //需要变换的数码管的数字序列
String value = "0146538";
int[][] light = init(); //初始化各数字所对应的需要灭的灯
String[] result = new String[value.length()]; //存放每个是自所对应的亮灭灯情况
int[] tmp = new int[7]; //存放每个数字所对应的亮灭灯状态:0为灯亮、1则为灯灭
int[] tmp2 = new int[7]; //存放每个数字灭了的灯号
int n; //计数tmp2中存入的个数
// 假设初始时全亮
for (int i = 0; i < value.length(); i++) {
int t = value.charAt(i) - '0'; //取得一个数字
result[i] = ""; //初始化该数字对应变换的结果值
n = 0;
for (int j = 0; j < light[t].length; j++) { //该数字所对应的需要灭的灯的数量,循环灭了
int m = tmp[light[t][j]]; //该等对应的亮灯状态,为0则灭了,否则不变,但是都需要将其灯号将如tmp2记录
if (m == 0) {
result[i] += "灭" + light[t][j];
tmp[light[t][j]] = 1;
}
tmp2[n++] = light[t][j];
}
for (int k = 0; k < tmp.length; k++) { //循环亮起该数字需要亮的等,即状态为1的则亮起,但是前面刚灭的不需要亮
if (tmp[k] == 1) {
int l;
for (l = 0; l < n; l++) {
if (tmp2[l] == k) {
break;
}
}
if (l == n) {
result[i] += "亮" + k;
tmp[k] = 0;
}
}
}
}
for (int i = 0; i < result.length; i++) { //循环输出每个数字所对应的灯管变化的情况
if (result[i].equals(""))
System.out.println("不变");
else
System.out.println(result[i]);
}
}
static int[][] init() { //初始化每个数字所对应需要灭的灯放入一个二维数组中
int[][] light = new int[10][];
light[0] = new int[1];
light[0][0] = 3;
light[1] = new int[5];
light[1][0] = 0;
light[1][1] = 1;
light[1][2] = 3;
light[1][3] = 4;
light[1][4] = 6;
light[2] = new int[2];
light[2][0] = 1;
light[2][1] = 5;
light[3] = new int[2];
light[3][0] = 1;
light[3][1] = 4;
light[4] = new int[3];
light[4][0] = 0;
light[4][1] = 4;
light[4][2] = 6;
light[5] = new int[2];
light[5][0] = 2;
light[5][1] = 4;
light[6] = new int[1];
light[6][0] = 2;
light[7] = new int[4];
light[7][0] = 1;
light[7][1] = 3;
light[7][2] = 4;
light[7][3] = 6;
light[8] = new int[0];
light[9] = new int[2];
light[9][0] = 4;
light[9][1] = 6;
return light;
}
}
结果如下:
至此,该题目就结束了,以上为个人思路,仅供参考,有什么不到位的地方欢迎批评指正,谢谢......