把握不好数组边界的危害(记洛谷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语言描述)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】顺序栈的Java实现
- 下一篇: 【Java】避免用户篡改查询结果的GUI