我有一个二维数组。
其中每一个元素都有一个属性1和0;
当我输入一个元素位置后,
需要自动把和该元素相连的相同属性的元素打出来。
有点类似photoshop的魔棒!
其中每一个元素都有一个属性1和0;
当我输入一个元素位置后,
需要自动把和该元素相连的相同属性的元素打出来。
有点类似photoshop的魔棒!
解决方案 »
- 文本赋值给string问题
- jtable中增加combox的事件?
- java 文档中怎么有些函数找不到?
- 在Struts结构中。。。表单验证中怎么得到表单里面值的??
- 求教:sun有了awt为什么还要提供swing?
- 我学完了java基本的语法,简单的输入/输出,图形设计,但发现什么都不会,连记事本这样的程序都编不出来……
- 关于java.awt.Canvas的使用,在线等待
- 谁能帮我解释一下三元运算符(...?...:...)是什么意思,结果是什么?
- cast问题
- 关于Clone的问题。
- 谁能告诉我jbuilder9和SQL2000怎么连起来呢?上那找驱动啊?
- 在方法里面把对象设成null(紧急)
[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)
* 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);
}}
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); }
}
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();
}}
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可能我说的不是很清楚!
原来我的递归产生了死循环。
互相学习 共同提高