【算法设计与分析基础】关灯游戏
① R.java 用于存储一些全局变量
package lightoff;public class R {/*public static int lightCondition[][] = {{1,0,0,1,1},{1,0,0,1,1},{1,0,0,1,1},{1,0,0,1,1},};*/public static int lightCondition[][] = {{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1},};//灯面板有 n x m 个灯public static int n = lightCondition.length;//行public static int m = lightCondition[0].length;//列public static int rect_Height = 30;//形成的矩阵的高public static int rect_Width = 30;//形成的矩阵的宽public static int[][] lightswitch=new int[n][m];//哪些开关按过public static int frame_Height = 240+ n * rect_Height;//窗口的高度public static int frame_Width = 240 + m * rect_Width;//窗口的宽度public static Gauss g ;//高斯消元算法类public static LightPanel lP = new LightPanel();//n x m 灯面板public static ButtonPanel bP = new ButtonPanel();//按钮面板public static SurfaceView sv;//关灯游戏界面public static Demo d;//演示界面public static double g_sleeptime = 0.3;//生成开关影响表的暂停时间public static double l_sleeptime = 0.1;//转化成上三角矩阵的暂停时间public static double r_sleeptime = 0.5;//结果分析的暂停时间public static boolean demo = true;//是否需要演示。如果不需要请把这里设为false//矩阵面板左上角顶点的坐标public static int rect_x = 50;public static int rect_y = 50;/*** 重绘 n x m 面板* @param _n 行* @param _m 列*/public static void rewriteLightCondition(int _n,int _m){n=_n;m=_m;if(n>21){rect_Height = rect_Width = 20;}else{rect_Height = rect_Width = 30;}frame_Height = 240+ n * rect_Height;//窗口的高度frame_Width = 240 + m * rect_Width;lightCondition=new int[n][m];lightswitch=new int[n][m];int i,j;for(i=-1;++i
package lightoff;import java.lang.reflect.InvocationTargetException;public class GameBegin {public static void main(String[] args){try {javax.swing.SwingUtilities.invokeAndWait(new Runnable(){public void run(){R.sv = new SurfaceView();}});} catch (InvocationTargetException | InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}
}
package lightoff;class BreakPoint{int r;//断点所在的行int c;//当前是0还是1public BreakPoint(){r = -1;c = -1;}
}public class Gauss {int num = R.n * R.m;int[] ls = new int[num];int[][] gauss = new int[num][num];int[] answer = new int[num];BreakPoint[] bp = new BreakPoint[num];boolean exist = false;int n = 0;/*** 建立开关影响的表,做高斯消元求解*/public Gauss(){}public void setgauss(){if(R.demo){R.d.step_next(0);R.d.settitle("根据开关的影响建立高斯消元表");}/// 1. 开关的影响:建立高斯消元表 /int i,j,col;//遍历 n x m 面板for(i=-1;++i= 0 && y >= 0 && x < R.n && y < R.m;}/*** 进行异或运算* @param a 数字1* @param b 数字2* @return a 异或 b*/int xor(int a,int b){return a^b;}/*** 交换两个数字* @param x1 第一个数字的行坐标* @param x2 第二个数字的行坐标* @param y 它们有个共同的列坐标*/void swap(int x1,int x2,int y){gauss[x1][y]^=gauss[x2][y];gauss[x2][y]^=gauss[x1][y];gauss[x1][y]^=gauss[x2][y];}/*** 交换两行* @param r1 其中一行* @param r2 另外一行*/void swap(int r1,int r2){int i;for(i=-1;++i X* 0 0 1 => 无解* 0 1 0 => 无解* 0 1 1 => X* 1 0 0 => 0* 1 0 1 => 1* 1 1 0 => 1* 1 1 1 => 0* @param a gauss表中对角线上的值* @param b gauss表中对角线 右边一行的值乘以对应的answer 之和 % 2* @param c 该行上的常数列* @param i 该行行数* @return 分析后的值*/int analyze(int a,int b,int c,int i){int col = 0;if(R.demo){R.d.setabc(a, b, c);}if(a==1){return Math.abs(b-c);}else if(a==0){if(b==c){// 在 X 这里设置个断点col = getbp(i);if(col == -1){bp[n] = new BreakPoint();bp[n].r = i;bp[n].c = 0;n++;return 0;}return col;
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
