最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?九宮重排(滿分解法)

 更新時(shí)間:2022年05月24日 08:27:12   作者:愛敲代碼的三毛  
本文主要介紹了Java?九宮重排(滿分解法),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

題目

如下圖的九宮格中,放著 1 ~ 8 的數(shù)字卡片,還有一個(gè)格子空著。與空格子相鄰的格子中的卡片可以移動(dòng)到空格中。 經(jīng)過若干次移動(dòng),可以形成圖 2 所示的局面。

在這里插入圖片描述

我們把上圖的局面記為:12345678.

把下圖的局面記為:123.46758

在這里插入圖片描述

顯然是按從上到下,從左到右的順序記錄數(shù)字,空格記為句點(diǎn)。

題目的任務(wù)是已知九宮的初態(tài)和終態(tài),求最少經(jīng)過多少步的移動(dòng)可以到達(dá)。如果無論多少步都無法到達(dá),則輸出 -1。

輸入描述

輸入第一行包含九宮的初態(tài),第二行包含九宮的終態(tài)。

輸出描述

輸出最少的步數(shù),如果不存在方案,則輸出 -1。

輸入

12345678.
123.46758

輸出

3

思路

求最少步數(shù),典型的廣搜

  • 題目讓我們求最少步數(shù),我們可以模擬空格的移動(dòng)
  • 通過字符串的下標(biāo)交換字符位置,模擬字符串的上下左右的移動(dòng),每次移動(dòng)通過set判斷該狀態(tài)是否已經(jīng)移動(dòng)過,如果沒有就入隊(duì)列
  • 上(-3)下(+3)左(-1)右(+1)
  • 判斷每次的下標(biāo)是否合法,越界只要判斷示是否在字符串長度范圍內(nèi)

關(guān)鍵代碼:

(pos%3 != index%3 && pos/3 != index/3)

因?yàn)楫?dāng)前位置和上下都只是差3,左右都只是差1
如果是左右就一定滿足,下標(biāo)/3相等
如果是上下就一定滿足,下標(biāo)%3相等

在這里插入圖片描述

代碼

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String start = sc.next();
        String end = sc.next();

		// 枚舉字符串下標(biāo)的上下左右
        int[] upDownLeftRight = {-3,3,-1,1};
        // 去重
        Set<String> set = new HashSet<>();
        Queue<String> queue = new LinkedList<>();
        set.add(start);
        queue.offer(start);

        int count = 0;
        // 標(biāo)記是否已經(jīng)找到
        boolean flag = false;
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size-- != 0) {
                String s =  queue.peek();
                // 空格位置
                int index = s.indexOf(".");
                for (int i = 0; i < 4; i++) {
                    int pos = index + upDownLeftRight[i];
                    // 當(dāng)新的位置不是空格的上下左右或者已經(jīng)越界
                    if (pos < 0 || pos > 8 || (pos%3 != index%3 && pos/3 != index/3)) {
                        continue;
                    }

                    char c = s.charAt(pos);
                    char[] ch = s.toCharArray();
                    ch[pos] = ch[index];
                    ch[index] = c;

                    String str = new String(ch);
                    if (str.equals(end)) {
                        flag = true;
                        break;
                    }
                    if (set.add(str)) {
                        queue.offer(str);
                    }

                }
                queue.poll();
            }
            count++;
            if (flag) {
                break;
            }
        }
        if (flag) {
            System.out.println(count);
        } else {
            System.out.println(-1);
        }
    }
}

在這里插入圖片描述

 到此這篇關(guān)于Java 九宮重排(滿分解法)的文章就介紹到這了,更多相關(guān)Java 九宮重排內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 更改eclipse的JDK版本詳細(xì)步驟

    更改eclipse的JDK版本詳細(xì)步驟

    我們用eclipse在做項(xiàng)目的時(shí)候會(huì)切換jdk版本,本地運(yùn)行的項(xiàng)目所使用的jdk版本比Linux服務(wù)器高(低),需要調(diào)低(高)JDK版本,這篇文章主要給大家介紹了關(guān)于如何更改eclipse的JDK版本的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)

    如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù)

    這篇文章主要介紹了如何使用Java統(tǒng)計(jì)gitlab代碼行數(shù),實(shí)現(xiàn)方式通過git腳本將所有的項(xiàng)目拉下來并然后通過進(jìn)行代碼行數(shù)的統(tǒng)計(jì),需要的朋友可以參考下
    2023-10-10
  • 零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java

    零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java

    這篇文章主要介紹了零基礎(chǔ)如何系統(tǒng)的學(xué)習(xí)Java,很多朋友糾結(jié)這個(gè)問題,教材書不知道從何學(xué)起,今天小編給大家分享一篇教程幫助到家梳理這方面的知識(shí)
    2020-07-07
  • 淺談java內(nèi)存管理與內(nèi)存溢出異常

    淺談java內(nèi)存管理與內(nèi)存溢出異常

    下面小編就為大家?guī)硪黄獪\談java內(nèi)存管理與內(nèi)存溢出異常。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • springboot+log4j.yml配置日志文件的方法

    springboot+log4j.yml配置日志文件的方法

    這篇文章主要介紹了springboot+log4j.yml配置日志文件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java通過 Socket 實(shí)現(xiàn) TCP服務(wù)端

    Java通過 Socket 實(shí)現(xiàn) TCP服務(wù)端

    這篇文章主要介紹了Java通過 Socket 實(shí)現(xiàn) TCP服務(wù)端的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解

    Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解

    SpringBootAdmin是一個(gè)管理和監(jiān)控SpringBoot應(yīng)用程序的工具,可通過集成和配置實(shí)現(xiàn)應(yīng)用監(jiān)控與告警功能,本文給大家介紹Spring?Boot?Admin集成與自定義監(jiān)控告警示例詳解,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 舉例講解Java的RTTI運(yùn)行時(shí)類型識(shí)別機(jī)制

    舉例講解Java的RTTI運(yùn)行時(shí)類型識(shí)別機(jī)制

    這篇文章主要介紹了Java的RTTI運(yùn)行時(shí)類型識(shí)別機(jī)制,包括泛化的Class引用以及類型檢查instanceof等知識(shí)點(diǎn),需要的朋友可以參考下
    2016-05-05
  • 詳解java實(shí)踐SPI機(jī)制及淺析源碼

    詳解java實(shí)踐SPI機(jī)制及淺析源碼

    這篇文章主要介紹了詳解java實(shí)踐SPI機(jī)制及淺析源碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java LinkedHashMap深入分析源碼

    Java LinkedHashMap深入分析源碼

    大多數(shù)情況下,只要不涉及線程安全問題,Map基本都可以使用HashMap,不過HashMap有一個(gè)問題,就是迭代HashMap的順序并不是HashMap放置的順序,也就是無序。HashMap的這一缺點(diǎn)往往會(huì)帶來困擾,所以LinkedHashMap就閃亮登場了,這篇文章通過源碼解析帶你了解LinkedHashMap
    2022-11-11

最新評(píng)論

轮台县| 监利县| 景东| 罗山县| 固阳县| 龙井市| 广元市| 福泉市| 澄江县| 姚安县| 仲巴县| 榆中县| 册亨县| 内江市| 呼玛县| 沁阳市| 黑河市| 河北省| 浪卡子县| 三亚市| 确山县| 六安市| 巴林右旗| 巴林左旗| 庆元县| 明星| 潮安县| 枣庄市| 台中市| 长宁县| 南和县| 武胜县| 鹿泉市| 兴化市| 台中市| 晴隆县| 普洱| 木兰县| 湘潭县| 比如县| 营口市|