​​Java實現 藍橋杯 演算法提高 八數碼(BFS)

專注的阿熊發表於2020-04-30

Java實現 藍橋杯 演算法提高 八數碼(BFS)

試題 演算法提高 八數碼

問題描述

  RXY八數碼

輸入格式

  輸入兩個33表格

  第一個為目標表格

  第二個為檢索表格

輸出格式

  輸出步數

樣例輸入

1 2 3

4 5 6

7 8 0

1 2 3

4 5 6

7 0 8

樣例輸出

1

資料規模和約定

  33*2

 

PS:

花裡胡哨得,直接套程式碼搜

 

 

 

import java.util.*;

 

public class Main {

static int[]dx = {0,0,1,-1};

static int[]dy = {1,-1,0,0};

static int[][]st = new int[3][3];

public static void main(String[] args){

Scanner scan = new Scanner(System.in);

int [][]st1 = new int[3][3];

for(int i=0;i<3;++i){

for(int j=0;j<3;++j){

st1[i][j]=scan.nextInt();

}

}

for(int i=0;i<3;++i){

 function(){   //外匯分析師:


for(int j=0;j<3;++j){

st[i][j]=scan.nextInt();

}

}

System.out.println(bfs(st1));

}

public static int[][] swap(int[][]st1,int i,int j,int sx,int sy){

int[][]st2 = new int[3][3];

for(int w=0;w<3;++w){

for(int e=0;e<3;++e){

st2[w][e]=st1[w][e];

}

}

int x = st2[i][j];

st2[i][j]=st1[sx][sy];

st2[sx][sy]=x;

return st2;

}

public static int bfs(int[][]st1){

Queue<int[][]> q = new LinkedList<>();

HashMap<int[][],Integer> m = new HashMap<>();

q.offer(st1);

m.put(st1, 0);

while(!q.isEmpty()){

int[][]st2 = q.poll();

boolean b1 = true;

for(int w=0;w<3;++w){

for(int e=0;e<3;++e){

if(st2[w][e]!=st[w][e]){

b1=false;

}

}

}

if(b1){

return m.get(st2);

}

for(int i=0;i<3;++i){

for(int j=0;j<3;++j){

if(st2[i][j]==0){

for(int k=0;k<4;++k){

int sx = i+dx[k];

int sy = j+dy[k];

if(sx<0||sx>=3||sy<0||sy>=3){

continue;

}

int[][]st3=swap(st2,i,j,sx,sy);

if(!m.containsKey(st3)){

q.offer(st3);

m.put(st3, m.get(st2)+1);

}

}

}

}

}

}

return -1;

}

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2689482/,如需轉載,請註明出處,否則將追究法律責任。

相關文章