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

歡迎訪問 生活随笔!

生活随笔

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

java

把握不好数组边界的危害(记洛谷P1789题RE+WA的经历,Java语言描述)

發布時間:2025/3/15 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 把握不好数组边界的危害(记洛谷P1789题RE+WA的经历,Java语言描述) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

整體分析

先讀取第一行的三個數,再設計算法。
這里我比較笨,沒有用什么好的算法,卻也沒厚著臉皮直接完全暴力求解……(不過還是暴力解法)

數據結構的話,N×N的boolean數組即可,乍一看是不可避免的。

對于螢石,就是很簡單啦,直接開雙層循環就完事,構成一個5×5方陣即可。
對于火把,就需要先處理~~

我們分別對黑色圈內的和非黑色圈內的部分進行處理即可。

注意細節

細節分析起來挺曲折的,雖然這題還是不難。

需要注意的是數組越界,在Java里用了二維數組還涉及邊界情況,就跑不開ArrayIndexOutOfBoundsException,必須對邊界情況詳細分析。

另需要注意的是我們用的數組是[0 ~ N-1][0 ~ N-1],然而輸入的是1 ~ N,這個一定不要搞錯了呀。

自測WA

按照提供的測試用例測試,結果應該是12,打印的是16,多了4個,于是發現bug在與我沒看清楚“火把”的7、9、17、19四個位置是true(亮的),于是乎,修復。

不斷的自測,感覺良好,提交去~~

第一次提交——RE+WA


分析一下為啥WA,其實發現就是上面說的那個問題,沒理解清楚給的測試數據其實是我們人類計數的方式(從1開始),從而處理錯了。

再分析RE,運行時的異常一般來說這里就是數組越界了,讀讀代碼看不出來,那就測試邊界。

發現是-1越界,就找代碼,發現這個:

其實想想也是,既然是合理的算法,為啥會重復報warning呢,必是Ctrl+V的時候沒改好……
修復:

再次提交~~

第二次提交——RE


沒WA證明思路基本OK,RE就還是數組越界,很煩人……

于是想到自己的測試在矩陣左上角測的,右下角沒測試,補測一下:

太真實了,真的錯了,55555~~

修復一下:

反復測試,覺得真的ok了,最終提交~~

第三次提交——AC


好開心啊!(雖然這題初中一年級水平,wtcl~~)

AC代碼(Java)

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);//矩陣大小參數int matrixLen = scanner.nextInt();//火把數int torchNum = scanner.nextInt();//螢石數int candNum = scanner.nextInt();//創建矩陣boolean[][] matrix = new boolean[matrixLen][matrixLen];//填充火把可以照亮的位置for (int i = 0; i < torchNum; i++) {int x = scanner.nextInt() - 1;int y = scanner.nextInt() - 1;//左不越界if (x - 1 >= 0) {//左不越界+上不越界if (y - 1 >= 0) {matrix[x-1][y-1] = true;}//左不越界+下不越界if (y + 1 < matrixLen) {matrix[x-1][y+1] = true;}}//右不越界if (x + 1 < matrixLen) {//右不越界+上不越界if (y - 1 >= 0) {matrix[x+1][y-1] = true;}//右不越界+下不越界if (y + 1 < matrixLen) {matrix[x+1][y+1] = true;}}for (int j = 0; j <= 2; j++) {//左不越界if (x - j >= 0) {matrix[x-j][y] = true;}//右不越界if (x + j < matrixLen) {matrix[x+j][y] = true;}//上不越界if (y - j >= 0) {matrix[x][y-j] = true;}//下不越界if (y + j < matrixLen) {matrix[x][y+j] = true;}}}//填充螢石可以照亮的位置for (int i = 0; i < candNum; i++) {int x = scanner.nextInt() - 1;int y = scanner.nextInt() - 1;for (int j = 0; j <= 2; j++) {if (x - j >= 0) {for (int k = 0; k <= 2; k++) {if (y - k >= 0) {matrix[x-j][y-k] = true;}if (y + k < matrixLen) {matrix[x-j][y+k] = true;}}}if (x + j < matrixLen) {for (int k = 0; k <= 2; k++) {if (y - k >=0) {matrix[x+j][y-k] = true;}if (y + k < matrixLen) {matrix[x+j][y+k] = true;}}}}}//計算數量int count = 0;for (int i = 0; i < matrixLen; i++) {for (int j = 0; j < matrixLen; j++) {if (!matrix[i][j]) {count++;}}}System.out.println(count);//關閉輸入流scanner.close();} }

說明

寫OJ寫得少,寫的就很臃腫,還望dl們不吝賜教~~
OrzOrz

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的把握不好数组边界的危害(记洛谷P1789题RE+WA的经历,Java语言描述)的全部內容,希望文章能夠幫你解決所遇到的問題。

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