日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

發布時間:2025/3/15 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 枚举求解单词方阵(洛谷P1101题题解,Java语言描述) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目要求

P1101題目鏈接

分析

可以用DFS做,但我立下了個Flag,所以就用了樸素的枚舉來做。。。。

結果,我的天哪,做了好幾個小時……

其實這種地圖題,真的適合 DFS or BFS or DP 這種,這種八向枚舉,太難受了。
好處是可以不去分析遞歸問題或者動態轉移方程。

我開兩個數組,一個是char類型,一個是byte類型(其實是相當于boolean類型)。
題好像沒給數值邊界,所以我怕爆炸,使用BufferedReader而不是Scanner(其實這種也不是讀數值,可能差不到太多)。

DFS等搜索算法寫法的思路是從一個點開始逐步遞歸到邊界,每次八向嘗試。但樸素暴力算法則不同。

我們把問題全局看,不著眼于某個點及其下一步的分散走向,有四大類:

  • 每一行
  • 每一列
  • 每一個長度大于7的“主對角線”
  • 每一個長度大于7的“次對角線”
  • 想要反向,其實可以換個思路,就是改為判斷"yizhong"反過來的"gnohziy",這樣就簡化了問題,把把八種情況化作四種情況。

    再就是,對角線要在兩側開,所以要細分情況。

    這題其實我這么寫很難寫,需要考慮整個的邊界值,自閉……

    再就是一個核心算法了:數組中串的模式匹配。
    先使用StringBuilder把數組元素遍歷從而湊成串,然后使用indexOf()和replace(),在循環中進行多次匹配,因為可能有多次出現。(這種用法我在其他洛谷題題解博客中寫到過,挺實用)

    避坑指南

    錯了三次。

    第一次是repeat()的問題,這個其實在代碼注釋中也說了,洛谷的Java8不支持repeat()但Idea瘋狂暗示使用這個,沒辦法你只能改。

    第二次是空格問題,我習慣性打印了空格,把每個元素分開,但這題沒分隔符。

    第三次就是發現了可能在一行、一列、一對角線中有多次重復串,需要多次匹配,就把代碼幾乎翻了一遍。
    測試數據點3:
    in

    16 qyizhongqyizhong gydthkjygydthkjy nwidghjinwidghji orbzsfgzorbzsfgz hhgrhwthhhgrhwth zzzzzozozzzzzozo iwdfrgngiwdfrgng yyyyggggyyyygggg qyizhongqyizhong gydthkjygydthkjy nwidghjinwidghji orbzsfgzorbzsfgz hhgrhwthhhgrhwth zzzzzozozzzzzozo iwdfrgngiwdfrgng yyyyggggyyyygggg

    out

    *yizhong*yizhong gy******gy****** n*i*****n*i***** o**z****o**z**** h***h***h***h*** z****o**z****o** i*****n*i*****n* y******gy******g *yizhong*yizhong gy******gy****** n*i*****n*i***** o**z****o**z**** h***h***h***h*** z****o**z****o** i*****n*i*****n* y******gy******g

    AC代碼(Java語言描述)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));int num = Integer.parseInt(reader.readLine());char[][] chars = new char[num][num];byte[][] flags = new byte[num][num];//初始化for (int i = 0; i < num; i++) {char[] temp = reader.readLine().toCharArray();for (int j = 0; j < num; j++) {chars[i][j] = temp[j];}}reader.close();if (num < 7) {StringBuilder result = new StringBuilder();for (int i = 0; i < num; i++) {result.append('*');}//洛谷不識別下面的代碼//String result = "*";//result = result.repeat(num);for (int i = 0; i < num; i++) {System.out.println(result);}return;}//水平方向for (int i = 0; i < num; i++) {StringBuilder temp = new StringBuilder(), temp2;for (int j = 0; j < num; j++) {temp.append(chars[i][j]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = index; j < index+7; j++) {if (flags[i][j] == 0) {flags[i][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = index; j < index+7; j++) {if (flags[i][j] == 0) {flags[i][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//豎直方向for (int j = 0; j < num; j++) {StringBuilder temp = new StringBuilder(), temp2;for (int i = 0; i < num; i++) {temp.append(chars[i][j]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int i = index; i < index+7; i++) {if (flags[i][j] == 0) {flags[i][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int i = index; i < index+7; i++) {if (flags[i][j] == 0) {flags[i][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//主對角線方向//下方掃描for (int i = 0; i < num-7; i++) {StringBuilder temp = new StringBuilder(), temp2;int x = i, y = 0;while (x < num) {temp.append(chars[x++][y++]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = i+index, k = index; k < index+7; j++, k++) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = i+index, k = index; k < index+7; j++, k++) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//主對角線方向//右側掃描for (int i = 0; i < num-7; i++) {StringBuilder temp = new StringBuilder(), temp2;int x = 0, y = i;while (y < num) {temp.append(chars[x++][y++]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = i+index, k = index; k < index+7; j++, k++) {if (flags[k][j] == 0) {flags[k][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = i+index, k = index; k < index+7; j++, k++) {if (flags[k][j] == 0) {flags[k][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//次對角線方向//下方掃描for (int i = 0; i < num-6; i++) {StringBuilder temp = new StringBuilder(), temp2;int x = i, y = num-1;while (x < num) {temp.append(chars[x++][y--]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = i+index, k = num-index-1; j < i+index+7; j++, k--) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = i+index, k = num-index-1; j < i+index+7; j++, k--) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//次對角線方向//左側掃描for (int i = num-1; i > 5; i--) {StringBuilder temp = new StringBuilder(), temp2;int x = 0, y = i;while (y > 0) {temp.append(chars[x++][y--]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = index, k = i-index; j < index+7; j++, k--) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = index, k = i-index; j < index+7; j++, k--) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//打印結果for (int i = 0; i < num; i++) {StringBuilder result = new StringBuilder();int j;for (j = 0; j < num; j++) {if (flags[i][j] == 0) {result.append('*');} else {result.append(chars[i][j]);}}System.out.println(result);}} }

    總結

    以上是生活随笔為你收集整理的枚举求解单词方阵(洛谷P1101题题解,Java语言描述)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。