我有一个二维数组。
其中每一个元素都有一个属性1和0;
当我输入一个元素位置后,
需要自动把和该元素相连的相同属性的元素打出来。
有点类似photoshop的魔棒!

解决方案 »

  1.   

    简单一种方法:3 * 3 数组,可构造:[0][0]:(1,0),(0,1),
    [0][1]:(1,0),(-1,0),(0,1)
    [0][2]:(-1,0)(0,1)[1][0]:(1,0),(0,1),(0,-1)
    [1][1]:(1,0),(0,1),(-1,0),(0,-1)
    [1][2]:(-1,0),(0,-1),(0,1)...x坐标向右,y坐标向下(x,y)
      

  2.   

    /*
     * Created on Mar 28, 2006
     *
     * TODO To change the template for this generated file go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    package com.apach;/**
     * @author YongDongLiang
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class SameArray {
    static int point ;
    static int[][] planar = {
    {1,1,1,1,1},
    {1,1,1,1,1},
    {0,0,0,0,0},
    {1,1,0,1,1},
    {1,1,0,0,1}};
    static int ylen = planar.length;
    static int xlen = planar[0].length;


    static void prt(int y,int x,int flag){
    point = planar[y][x];
    System.out.println("planr["+y+"]"+"["+x+"]"+"="+point);

    if((flag ==0||flag!=2)&&(x>0)) if(planar[y][x-1]==point) prt(y,x-1,1); if((flag==0||flag!=1)&&(x<xlen-1)) if(planar[y][x+1]==point) prt(y,x+1,2); if((flag==0||flag!=4)&&y>0) if(planar[y-1][x]==point) prt(y-1,x,3); if((flag==0||flag!=3)&&(y<ylen-1)) if(planar[y+1][x]==point) prt(y+1,x,4);
    }

    public static void main(String[] args){ prt(2,3,0);

    }}
      

  3.   


    import java.security.InvalidParameterException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;public class BFS {
    int size; char[][] map; char[][] outMap; int[][] closeList; int[][] adj = new int[][] { { -1, 1 }, { 0, 1 }, { 1, 1 }, { 1, 0 },
    { 1, -1 }, { 0, -1 }, { -1, -1 }, { -1, 0 } }; List queue = new ArrayList(); public BFS(int size) {
    this.size = size;
    map = new char[size][size];
    outMap = new char[size][size];
    initMap(map, size, 'r');
    initMap(outMap, size, '.');
    closeList= new int[size][size]; } private void initMap(char[][] map, int size, char type) {
    Random r = new Random();
    for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
    if (type == 'r')
    map[i][j] = (char) ('0' + Math.abs(r.nextInt() % 2));
    else
    map[i][j] = '.';
    }
    }
    } public void showMap(char[][] map) {
    for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
    System.out.print(map[i][j]+" ");
    }
    System.out.println("");
    }
    } public void BFS(int posX, int posY) {
    if (posX < 0 || posY < 0 || posX >= size || posY >= size)
    throw new InvalidParameterException();
    int flag = map[posX][posY];
    queue.add(new Integer(posX * size + posY));

    while (queue.size() != 0) {
    int pxy = ((Integer) queue.get(0)).intValue();
    int px = pxy / size;
    int py = pxy % size;
    for (int i = 0; i < adj.length; i++) {
    int x = px + adj[i][0];
    int y = py + adj[i][1];
    if (x > -1 && x < size && y > -1 && y < size) {
    if (closeList[x][y] == 0 && map[x][y] == flag) {
    outMap[x][y] =  map[x][y];

    queue.add(new Integer(x * size + y));
    closeList[x][y] = 1;
    }
    }
    }
    queue.remove(0);
    } } public static void main(String[] args) {
    BFS test = new BFS(10);
    test.showMap(test.map);
    test.BFS( 5,5);
    System.out.println() ;
    test.showMap(test.outMap); }
    }
      

  4.   

    package others;public class MagicPoint {
    private static  int SIZE=50;
    private static  int SCOPE=2;
    private int flag;
    private int[][] plane=new int[SIZE][SIZE]; 
    private boolean[][] visited=new boolean[SIZE][SIZE];
    public MagicPoint(){
    initPlane();
    initVisited();
    }
            //初始化2维数组,这里用random输入,具体因该根据需要修改
    private void initPlane(){
    for(int i=0;i<plane.length;i++){
    plane[i]=new int[SIZE];
    for(int j=0;j<plane[i].length;j++){
    plane[i][j]=(int)(Math.random()*SCOPE);
    }
    }
    }
             //初始化访问标记数组
    private void initVisited(){
    for(int i=0;i<visited.length;i++){
    visited[i]=new boolean[SIZE];
    for(int j=0;j<visited[i].length;j++)
    visited[i][j]=false;
    }
    }
             //定义寻找标记
    public void setFlag(int i,int j){
    flag=plane[i][j];
    }
             //打印函数
    public void prt(){
    for(int i=0;i<visited.length;i++){
    for(int j=0;j<visited.length;j++)
    if(visited[i][j]==true)System.out.print(flag);
    else System.out.print("#");
    System.out.println();
        }
    }
    //这里定义与flag比较函数,这里用相等,可扩展为其他形式,如相近
    private boolean cmp(int i,int j){
    return plane[i][j]==flag;
    }
    //溢出判断
    private boolean overFlow(int i,int j){
    if(i>=0&&i<SIZE&&j>=0&&j<=SIZE)return false;
    else return true;
    }
             //递归访问
    public void search(int i,int j){
    //置访问标记
    visited[i][j]=true;
    //向右走
    if(!overFlow(i,j+1)&&cmp(i,j+1)&&visited[i][j+1]==false)
       search(i,j+1);
    //向下走
    if(!overFlow(i+1,j)&&cmp(i+1,j)&&visited[i+1][j]==false)
       search(i+1,j);
    //向左走
    if(!overFlow(i,j-1)&&cmp(i,j-1)&&visited[i][j-1]==false)
       search(i,j-1);
    //向上走
    if(!overFlow(i,j-1)&&cmp(i,j-1)&&visited[i-1][j]==false)
       search(i,j-1);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    int row=1,col=1;
    MagicPoint mp=new MagicPoint();
    if(args.length==2){
    row=Integer.parseInt(args[0]);
    col=Integer.parseInt(args[1]);
    }

    mp.setFlag(row,col);
    mp.search(row,col);
    mp.prt();
    }}
      

  5.   

    楼主的意思是否是:比如有
    10001
    01010
    00100
    01010
    10001上面的数据返回结果应该是:
    如果我选当前的位置为最中间那个1,x=2,y=2的那个(从0开始算),我调用1的一个方法把相邻的1取出来,在上面那个图应该只返回中间那个1,因为这个1和其他的1并不是相邻,相邻是指上下左右相邻。
    再比如我选当前位置为x=4,y=2的那个0,就是中间那排,最右边那列。调用这个0的一个方法,会返回右边的4个0。形状如下。
    111
    110
    100
    110
    111可能我说的不是很清楚!
      

  6.   

    dogod(那天,正喝着汤,猛然间....睡着了!) 兄,正解!
    原来我的递归产生了死循环。
      

  7.   

    java交流群-22065798
    互相学习 共同提高