Софтуерно Инженерство
Loading...
+ Нов въпрос
VasilK avatar VasilK 37 Точки

10.Lady_Bugs

Решението гърми на проверка 9 и 10. Тествах какво ли не. Възможно е да се дължи на ограниченията в условието на задачата.

Доста съм зациклил и може да не виждам очевидна грешка.  

import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;

public class tttt {

    public static void main(String[] args) {

        Scanner scanner = new Scanner( System.in );

        int s = Integer.parseInt( scanner.nextLine() );
        String[] arr_i = scanner.nextLine().split( " " );

        int[] lb = new int[s];

        for (int l = 0; l < lb.length; l++) {
            if (Arrays.asList(arr_i).contains( Integer.toString( l ) )) lb[l] = 1;
        }

        String str;
        while (!(str = scanner.nextLine()).equals("end")) {

            String[] arr = str.split( " " );

            int ind = Integer.parseInt( arr[0] );
            String dir = arr[1];
            int len = Integer.parseInt( arr[2] );

            if (ind < 0 || ind >= s || lb[ind] == 0 || len == 0) continue;

            lb[ind] = 0;
            for (int x = 0; x < lb.length; x++) {
                if (dir.equals("right") && (ind + len + x) >= 0 && (ind + len + x) < s && lb[ind + len + x] == 0) {
                    lb[ind + len + x] = 1;
                    break;
                } else if(dir.equals("right") && (ind + len + x) >= 0 && (ind + len + x) < s && lb[ind + len + x] == 1) {
                    continue;
                } else if (dir.equals("left") && (ind - (len + x)) >= 0 && (ind - (len + x)) < s && lb[ind - (len + x)] == 0) {
                    lb[ind - (len + x)] = 1;
                    break;
                } else if (dir.equals("left") && (ind - (len + x)) >= 0 && (ind - (len + x)) < s && lb[ind - (len + x)] == 1) {
                    continue;
                } else {
                    break;
                }
            }
        }
        for (int v : lb) System.out.print( v + " " );
    }
}
Тагове:
0
Technology Fundamentals
VasilK avatar VasilK 37 Точки
Така вече минава. Порблема идва от x във for loop.
вход
5
0 2         -> 1 0 1 0 0  
0 left -2   -> 0 0 1 0 1
end 

връща 0 1 1 0 0
както е написан кода лети 2 надясно  ind(0) - (len(-2) + x(0)) = 2 -> 0 0 1 0 0
индекс 2 е зает и трябва да прелети още две надясно, т.е трябва ни индекс 4.
И тука започва мазалото, ind(0) - (len(-2) + x(1)) = 1 -> 0 1 1 0 0
В случай, че полето е заето, вместо +x коректно е +len.

import java.util.*;
public class tttt {

    public static void main(String[] args) {

        Scanner scanner = new Scanner( System.in );

        int[] lb = new int[Integer.parseInt(scanner.nextLine())];
        int[] arr_i = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(e -> Integer.parseInt(e)).toArray();

        for (int i = 0; i < arr_i.length; i++) {
            if (arr_i[i] >= 0 && arr_i[i] < lb.length) {
                lb[arr_i[i]] = 1;
            }
        }

        String str;
        while (!(str = scanner.nextLine()).equals("end")) {

            String[] arr = str.split( " " );

            int ind = Integer.parseInt(arr[0]);
            String dir = arr[1];
            int len = Integer.parseInt(arr[2]);

            if (ind < 0 || ind >= lb.length || lb[ind] == 0 || len == 0) continue;

            lb[ind] = 0;
            int curlen = len;

            while (true) {

                if ((dir.equals("right") && (ind + curlen < 0 || ind + curlen >= lb.length)) ||
                (dir.equals("left") && (ind - curlen < 0 || ind - curlen >= lb.length))) {
                    break;
                }

                if (dir.equals("right") && lb[ind + curlen] == 0) {
                    lb[ind + curlen] = 1;
                    break;
                } else if (dir.equals("left") && lb[ind - curlen] == 0) {
                    lb[ind - curlen] = 1;
                    break;
                } else {
                    curlen += len;
                }

            }

        }
        for (int v : lb) System.out.print( v + " " );
    }
}
0
svetlakrasteva avatar svetlakrasteva 5 Точки

Благодаря за споделеното решение. Аз съм very beginner и не мога да се справя сама. Прегледах много предложени решения, но ми се струваха объркани и оплетени. Твойто е на има-няма 30 реда (без да броим празни и скоби) и е супер ясно. Поздрави за което!!!

Само смених имената на променливите, за да разбирам, като чета кода (lb = fieldArray, arr_i = lbArray и т.н...)

0
VasilK avatar VasilK 37 Точки

Радвам се че кода ти е полезен. По мое мнение колко е оптимален кода зависи много от това как си представяш решението веднага след като прочетеш условието. Щом ми хрумне нещо веднага го подлагам на критика дали е оптимално. Имам по 4, 5 весии на задача които минават проверките.

Мисля че на този етап по-оплетен код е по-полезен от гледна точка упражняване на логика и подход.

0
14/02/2019 23:48:45
svetlakrasteva avatar svetlakrasteva 5 Точки

Не съм съгласна, че оплетеният код е полезен за упражняване на логиката и подхода.

Твоят подход в много правилен:

  • Изключваш всички начални положения на калинката, които не работят, защото тя е извън полето, или не е в подадения индекс.
  • Изключваш всички положения на калинката след преместването, при които попада извън полето
  • и накрая остават само работещите варианти.

В бъдещите задачи ще се старая да прилагам този подход на изключване на неработещи варианти още в началото.

Още веднъж благодаря.

0