广度优先搜索学习五例之四
例:输出由数字0,1,2..n组成的全部可重复全排列
import java.util.Scanner;import java.util.Queue;import java.util.LinkedList;public class Permutation{ public static void main(String[] args){ Scanner in=new Scanner(System.in); int n=in.nextInt(); System.out.println("由数字0--"+n+"可生成"+BFS(n+1)+"种可重复全排列"); } public static long BFS(int k) { String v=""; long s=0; //队列用来保存被访问节点的分支节点(邻接点) Queue< String> que = new LinkedList< String>(); que.offer(v);//起点入队列 while (!que.isEmpty()) { v = que.poll();//弹出当前顶点 //将当前节点的分支节(邻接)点加入到队列中 for (int i = 0; i < k; i++) { String u=v+i; if(u.length()==k){//如果是一个K位的排列,输出 System.out.println(u); ++s; } else que.add(u); } } return s; } } import java.util.*;public class Main{ private int[][] arr;//3*3棋盘 private boolean[] bb=new boolean[10000000]; private Queue< my> qu=new LinkedList< my>(); public Main(){ arr=new int[5][5]; for(int i=0;i<5;i++) Arrays.fill(arr[i],0); } public static void main(String[] args){ Scanner in=new Scanner(System.in); int n=in.nextInt();//从命令行接受初始状态 Main m=new Main(); m.bfs(n); } private void bfs(int t){ qu.add(new my("",t));//初始状态入队列 while(!qu.isEmpty()){ my h=qu.poll();//弹出当前状态int u=h.u;String s=h.s;if(u==123456780){//如果当前状态等于目标状态 System.out.println(s);//输出移动方案 return; }if(bb[u%9999991]) continue;//如果当前状态已访问过bb[u%9999991]=true;//标记当前状态为已访问int i=-1,j=-1,p=u; for(int u1=3;u1>0;u1--){//从整数表示状态转为棋盘表示状态,并找出“0”的位置 for(int u2=3;u2>0;u2--){ arr[u1][u2]=p%10; if(arr[u1][u2]==0){ i=u1; j=u2; } p/=10; } } change(i,j,i-1,j);//"0"向上移动 int y=getNum(); qu.add(new my(s+"u",y));//入队,记录状态,"u"代表向上 change(i-1,j,i,j);//复位 change(i,j,i+1,j);//“0”向下移动,"d"表示向下 y=getNum(); qu.add(new my(s+"d",y)); change(i+1,j,i,j);//复位 change(i,j,i,j+1);//“0”向右移动 y=getNum(); qu.add(new my(s+"r",y));//"r"表示向右 change(i,j+1,i,j);//复位 change(i,j,i,j-1);//“0”向左移动,"l"表示向左 y=getNum(); qu.add(new my(s+"l",y)); change(i,j-1,i,j);//复位 } System.out.println("unsolvable"); } //棋盘表示的状态转为用整数表示 private int getNum(){ int t=0; for(int i=1;i< 4;i++) for(int j=1;j< 4;j++){ t*=10; t+=arr[i][j]; } return t; } //处于棋盘某一位置(x,y,)的“0”,与位置(x2,yx)交换 private void change(int x1,int y1,int x2,int y2){ arr[x1][y1]=arr[x2][y2]; arr[x2][y2]=0; } private void print(){ for(int i=1;i<4;i++){ for(int j=1;j<4;j++) System.out.print(arr[i][j]+" "); System.out.println(); } } } class my{ String s=""; int u; public my(String t,int a){ u=a; s=t; }}