スクールの課題です。
1、多次元配列の広さを入力
例:4 4
2、指定された広さ分の情報の入力
例:1
4 4
0010
1110
0010
0010
例:2
3 5
00010
11001
01100
3、1を囲うのに必要な棒が何本必要か計算して出力
例:1は14本
例:2は18本
現在の考え方
1を囲うのに4本必要 - 重なっている分(1つの場所で2本) = 必要な本数
例で考えると
(4×6)- (5×2)= 24 - 10 = 14
(4×6)- (3×2)= 24 - 6 = 18
で求められるとわかりました。
しかし、途中でどうやってプログラミングをすればいいのかわからなくなってしまいました。
ループの中で要素数が一致するのを数えようと思ったのですが…timelimit exceededになりました。
import
1 2 3public class Main { 4 5 public static void main(String[] args) { 6 Scanner sc = new Scanner(System.in); 7 8 int heigt = sc.nextInt(); //高さを取得 9 int width = sc.nextInt(); //幅を取得h); 10 11 //情報を1文字ずつ配列に格納していく 12 String[][] flower = new String[heigt][width]; 13 int count = 0; //#の数を数える 14 for (int i = 0; i < heigt; i++ ){ 15 String str = sc.next(); 16 for (int j = 0; j < width; j++ ){ 17 char[] arrayC = str.toCharArray(); //1文字ずつに変換 18 Character tmp = arrayC[j]; 19 flower[i][j] = tmp.toString(); 20 if("#".equals(flower[i][j])){ 21 //#の数を数える 22 count++; 23 } 24 } 25 } 26 System.out.println(count); 27 int count2 = 0; //#の縦の要素数が一緒がいくつあるか 28 int count3 = 0; //#が連続で続いているか 29 int[][] flg = new int[heigt][width]; //#があるか確認したら1にする 30 int idx = 0; 31 for (int i = 0; i < heigt; ){ 32 for (int j = 0; j < width; j++ ){ 33 if(flg[i][j] == 0 && "#".equals(flower[i][j])){ 34 //#の位置の要素数を保存 35 idx = j; 36 flg[i][j] = 1; 37 }else{ 38 //#がなければflgをあげる(確認済) 39 flg[i][j] = 1; 40 } 41 } 42 if(i > 0){ 43 for (int k = 0; k < width; k++ ){ 44 if("#".equals(flower[i][k]) && idx == k){ 45 //# かつ 前のと同じ位置の場合カウントする 46 count2++; 47 } 48 } 49 } 50 } 51 System.out.println(count2); 52 } 53} 54コード
間違っている点や
他の考え方など、ご教授いただければと思います。
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー