WLDSHZB
WLDSHZB
2020-04-14 12:43
采纳率: 100%
浏览 150
已采纳

最难图形遍历,求大神解决!!!

图片说明

像这种图片怎么查找颜色相同的组件,找到相同的了,怎么才能知道颜色相同的方块是否相邻,像这种图片说明
我现在的方案是:先创建5个不同颜色的color对象(这张图片只有4中颜色,没次运行方块的颜色不一样。设置的概率的。),然后坐标查询每个方块的颜色,返回的颜色和出创建的颜色对象作比较,和color对象相同的颜色分别用0--4(0红色,1黄色,2绿色,3蓝色,4紫色)表示,之后就用一个长度为16的二维数组装起,这样就得到了每个坐标的颜色。数组里面的值为:1312003010320012。这个一维数组代表的是4x4的格子中颜色。我的难题就是怎么判断相同的数字相邻。
如果有这个问题解决办法或者有更好的算法请帮忙解答一下。
这个是图形代码,负责创建容器和创建排列组件:

package zhuJie_MB;

import java.awt.Color;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

import suanFa.XiaoChu_SF;

public  class Zhumianban_JM{
    public static JFrame jFrame;
    public static JButton[] jb=new JButton[16];

    public static void main(String[] args) {
        Zhumianban_JM zh=new Zhumianban_JM();
        zh.zhuJianMian();
        XiaoChu_SF jj=new XiaoChu_SF();
        jj.suan();
    }
    public void zhuJianMian() {
        Random r=new Random();
        jFrame=new JFrame("糖果Party");
        jFrame.setBounds(100,50,1000,600);
        jFrame.setLayout(null);

        final Color red=new Color(255,0,0);//设置5种颜色。
        final Color yellow=new Color(255,255,0);
        final Color green=new Color(0,255,0);
        final Color blue=new Color(0,0,255);
        final Color purple=new Color(128,0,128);
        int x=0;
        int y=0;
        for (int i = 0; i <16; i++) {//使用for循环16次。将16个组件初始化并添加到容器中。
            jb[i]=new JButton();
            int u=r.nextInt(15);//设置15的随机数。0-4红色,概率最高。以此类推。
            if (u>=0 && u<=4) {
                jb[i].setBackground(red);
            }else if (u>4 && u<=8) {
                jb[i].setBackground(yellow);
            }else if (u>8 && u<=11) {
                jb[i].setBackground(green);
            }else if (u>11 && u<=13) {
                jb[i].setBackground(blue);
            }else {
                jb[i].setBackground(purple);
            }
            jb[i].setBounds(x,y,80,80);//设置布局,使用变量想x,y当中介。使其排列为一个4x4的格子。
            if (x==240) {
                y+=80;
                x=0;
            }else {
                x+=80;
            }
            jFrame.add(jb[i]);
        }
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }

}

这个是相关的算法:

package suanFa;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;

import zhuJie_MB.Zhumianban_JM;

public class XiaoChu_SF {
    static Robot robot=null;
    static int xxx=145;//获取屏幕x坐标
    static int yyy=120;//获取屏幕y坐标
    static int col;//定义一个变量,用来储存颜色所对应的数字。
    static int[] color=new int[16];//定义一个整型数组,用来装16个组件所对应的颜色代码。
    static Zhumianban_JM zh=new Zhumianban_JM();
    public static void suan() {
        final Color red=new Color(255,0,0);
        final Color yellow=new Color(255,255,0);
        final Color green=new Color(0,255,0);
        final Color blue=new Color(0,0,255);
        final Color purple=new Color(128,0,128);


        new Thread() {//此处需要加一个线程,让线程停止1秒,不然进程未加载出来就开始查询坐标颜色。
            public void run() {
                try {
                    Thread.sleep(1000);
                    for (int i = 0; i <16; i++) {
                        try {
                            robot=new Robot();
                        } catch (AWTException e) {
                            e.printStackTrace();
                        }
                        robot.getPixelColor(xxx, yyy);
                        if (robot.getPixelColor(xxx, yyy).equals(red)) {
                            col=0;
                        }else if (robot.getPixelColor(xxx, yyy).equals(yellow)) {
                            col=1;
                        }
                        else if (robot.getPixelColor(xxx, yyy).equals(green)) {
                            col=2;
                        }
                        else if (robot.getPixelColor(xxx, yyy).equals(blue)) {
                            col=3;
                        }else if (robot.getPixelColor(xxx, yyy).equals(purple)) {
                            col=4;
                        }else {
                            col=50;
                        }
                        color[i]=col;//把每个颜色放到color数组中。
                        System.out.print(color[i]);
                        if (xxx==385) {//将每次查询是的坐标变换。使其查询坐标颜色时排列为4X4的格子。
                            yyy+=80;
                            xxx=145;
                        }else {
                            xxx+=80;
                        }
                        if (i==15) {//当颜色查询完毕后,进入no1方法。
                            no1();
                        }
                    }

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }.start();
    }
    public static void no1() {
        int x0 = 0,x1 = 0,x2 = 0,x3 = 0,x4 = 0;//定义5个变量用来储存相同颜色的个数。
        for (int i = 0; i <16; i++) {//需要查询16次
            if (color[i]==0) {//查询数组中的数字是否与0,1,2,3,4,相等。
                x0++;
            }else if (color[i]==1) {
                x1++;
            }else if (color[i]==2) {
                x2++;
            }else if (color[i]==3) {
                x3++;
            }else if (color[i]==4) {
                x4++;
            }
        }

        int[] xx0 =new int[x0];//定义5个数组用来储存相同颜色的位置。
        int[] xx1 =new int[x1];
        int[] xx2 =new int[x2];
        int[] xx3 =new int[x3];
        int[] xx4 =new int[x4];


        int xxx0=0;//用来当做xx0...的索引。
        if (x0>=4) {//如果相同的颜色的个数大于或者等于4就把他们所对应的位置保存到上面的数组中
            for (int i = 0; i <16; i++) {
                if (color[i]==0) {
                    xx0[xxx0]=i;
                    xxx0+=1;//每次索引加一。
                }
            }
        }
        int xxx1=0;
        if (x1>=4) {
            for (int i = 0; i <16; i++) {
                if (color[i]==1) {
                    xx1[xxx1]=i;
                    xxx1+=1;
                }
            }
        }
        int xxx2=0;
        if (x2>=4) {
            for (int i = 0; i <16; i++) {
                if (color[i]==2) {
                    xx2[xxx2]=i;
                    xxx2+=1;
                }
            }
        }
        int xxx3=0;
        if (x3>=4) {
            for (int i = 0; i <16; i++) {
                if (color[i]==3) {
                    xx3[xxx3]=i;
                    xxx3+=1;
                }
            }
        }
        int xxx4=0;
        if (x4>=4) {//判断组件是否有4个或者以上,如果有输出组件的位置。
            for (int i = 0; i <16; i++) {
                if (color[i]==4) {
                    xx4[xxx4]=i;
                    xxx4+=1;
                }
            }
        }

位置和数量都有了,就差怎么知道相邻了。4个或4个以上都算。有点像消消乐,但是消消乐只有横排和枞排。
注:每次运行的图形界面不一样

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • bobhuang
    bobhuang 2020-04-14 16:44
    已采纳

    假设两个格子的坐标为(x1,y1), (x2,y2).
    那么判断相邻: ((x1==x2) && (abs(y1-y2)==1)) || ((y1==y2) && (abs(x1-x2)== 1))

    用伪代码说明一下,怎么把二维数组分组

    // 0 表示未分组, >=1 表示分在哪个组
    group[16] = {0}
    color[16]
    group_num = 0;
    
    // 递归深度优先遍历, 在当前点的上下左右4个方向探索, 如果未分组, 且颜色一样,则加入当前分组
    dfs(x, group_id)
    {
      cur_color = color[x];
      check(x-4, cur_color,group_id);
      check(x-1, cur_color,group_id);
      check(x+1, cur_color,group_id);
      check(x+4, cur_color,group_id);
    }
    
    check(x, cur_color, group_id) {
      if (x >=0 && x <16 && 0 == group[x]) {
        if (color[x] == cur_color) {
          group[x] = group_id;
          dfs(x,group_id);
        }
      }
    }
    
    // 对每个点, 看是否已经分组, 如果未分组, 则新建分组并做深度优先遍历
    for (i = 0; i < 16; i++) {
      if (0 == group[i]) {
        group_num += 1;
        group[i] = group_num;
        dfs(i, color[i], group[i]);
      }
    }
    
    
    点赞 评论
  • qq_36911145
    封印di恶魔 2020-04-14 14:24

    相邻不简单,你都有二维数组了,看你两个数,哪个代表横哪个代表纵,颜色相同,横或纵相差为1不就是相邻了

    点赞 评论

相关推荐