Бумажная полоска на Java

325
15 апреля 2022, 23:20

Задана полоска длиной 2^k клеток и шириной в одну клетку. Полоску сгибают пополам так, чтобы правая половинка оказалась под левой. Сгибание продолжают до тех пор, пока сверху находится больше одной клетки. Необходимо пронумеровать клетки таким образом, чтобы после окончания сгибания полосы номера клеток в получившейся колонке были расположены в порядке 1,2,3,4,...,2^k.

Я написал код к ней

import javax.swing.*;
import java.awt.*;
public class JavaApp extends JFrame
{
    public JavaApp(){
        setTitle("Полоска");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400,400);
        setVisible(true);
        add(new Panel());
    }
    public static void main(String[] args)
    {
        JavaApp jApp = new JavaApp();
    }
}

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.Console;
public class Panel extends JPanel implements ActionListener
{
    static JTextField jText = new JTextField(15);
    JButton button = new JButton("Расчитать");
    static JTextField jRes = new JTextField();
    JLabel label1 = new JLabel("Введите k:");
    JLabel label2 = new JLabel("Результат:");
    public Panel()
    {
        setLayout(null);
        createInterface();
    }
    private void createInterface()
    {
        jText.setBounds(40,40,100,30);
        setVisible(true);
        add(jText);
        button.setBounds(150,40,100,30);
        add(button);
        button.addActionListener(this::actionPerformed);
        jRes.setBounds(40,100,300,30);
        add(jRes);
        label1.setBounds(40,20,100,20);
        label2.setBounds(40,75,100,20);
        add(label1);
        add(label2);
    }
    static int[] getMass(int count)
    {
        int[] mass = new int[count];
        for (int i = 0; i < mass.length; i++)
        {
            mass[i] = i++;
        }
        return mass;
    }
    static void change(int width, int height, int Xl, int Yl, int Xr, int Yr,  int[][] aMatrix)
    {
        for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
            {
                aMatrix[Xr + j][Yr + i] = aMatrix[Xl - j][Yl + (width - i) - 1];
                //System.out.println(aMatrix[Xl - j][Yl + (width - i) - 1]);
            }
        }
    }
    static void calc()
    {
        double k = Double.parseDouble(jText.getText());
        //System.out.println(jText.getText());
        int count = (int) Math.pow(2,k);
        int width = 1, Heigh = count / 2, XL = count, YL = 0, XR = 0, YR = 1;
        int[] myMass = getMass(count);
        int[][] matrix = new int[myMass.length][myMass.length];
        for (int i = 0; i < myMass.length; i++)
        {
            for (int j = 0; j < myMass.length; j++) 
            {
                matrix[i][j] = 0;
            }
        }
        for (int i = 0; i < myMass.length; i++) 
        {
            matrix[i][0] = myMass[i];
        }
        for (int i = 0; i < k; i++)
        {
            change(width * (int)Math.pow(2,i), Heigh / (int)Math.pow(2,i), XL / (int)Math.pow(2,i) - 1, YL, XR, YR * (int)Math.pow(2,i), matrix);
        }
        for (int i = 0; i < count; i++)
        {
            //jRes.setText(String.valueOf(matrix[0][i]));
            System.out.println(matrix[0][i]);
            if(i != count - 1)
            {
                jRes.setText(" ");
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        calc();
    }
}

Почему он не выдает нужный результат?

Answer 1

Решение найдено

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class JavaApp1 {
    static int[] GetMass(int count)
    {
        int[] mass = new int[count];
        for (int i = 0; i < mass.length; i++)
        {
            mass[i] = i + 1;
        }
        return mass;
    }
    static void Change(int width, int height, int Xl, int Yl, int Xr, int Yr, int[][] aMatrix) throws IOException
    {
        for (int i = 0; i < width; i++)
        {
            for (int j = 0; j < height; j++)
            {
                aMatrix[Xr + j][ Yr + i] = aMatrix[Xl - j] [Yl + (width - i) - 1];
            }
        }
    }
    public static void main(String[] args)
    {
        FileReader reader = null;
        try {
            reader = new FileReader("in.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        FileWriter writer = null;
        try {
            writer = new FileWriter("out.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
        double k = 0;
        try {
            k = Double.parseDouble(Files.readAllLines(Paths.get("in.txt")).get(0));
        } catch (IOException e) {
            e.printStackTrace();
        }
        int count = (int)Math.pow(2, k);
        int Width = 1, Height = count / 2, XL = count, YL = 0, XR = 0, YR = 1;
        int[] myMass = GetMass(count);
        int[][] matrix = new int[myMass.length][myMass.length];

        for (int i = 0; i < myMass.length; i++)
        {
            for (int j = 0; j < myMass.length; j++)
            {
                matrix[i][j] = 0;
            }
        }

        for (int i = 0; i < myMass.length; i++)
        {
            matrix[i][0] = myMass[i];
        }

        for (int i = 0; i < k; i++)
        {
            try {
                Change(Width * (int)Math.pow(2, i), Height / (int)Math.pow(2, i), XL / (int)Math.pow(2, i) - 1, YL, XR, YR * (int)Math.pow(2, i),  matrix);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        for (int i = 0; i < count; i++)
        {
            System.out.println(matrix[0][i]);
            try {
                writer.write(matrix[0][i]);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (i != count - 1) {
                try {
                    writer.write(" ");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Answer 2

Вот на Python тот же подход c разворотом прямоугольных частей размером w x h работает (ср. http://oeis.org/A281589), так что Вы, наверное, что-то с индексами напутали или использование pow не к тому результату привело.

k = 4
n = 1 << k
A = [[(i+1) for i in range(n)] for j in range(n)]
w = n // 2
h = 1
for i in range(k):
    for y in range(h):
        for x in range(w):
            A[2*h -1- y][w - 1 - x] = A[y][w + x]
    w //= 2
    h *= 2
for m in range(n):
    print(A[m][0], end = " ")
>>> 1 16 9 8 5 12 13 4 3 14 11 6 7 10 15 2 
READ ALSO
Альтернатива ключевого слова ref в Java

Альтернатива ключевого слова ref в Java

Нужно адаптировать метод из C# для JavaКак можно заменить ключевое слово ref в данной ситуации?

274
Как устроен static class

Как устроен static class

В интернете нашёл пример неправильного использования ThreadLocal переменной и внутренних классов

201
Как лучше всего вывести List &lt;Music&gt; list, где Music - это интерфейс?

Как лучше всего вывести List <Music> list, где Music - это интерфейс?

Есть класс MusicPlayer, у него есть поле List<Music> list , где Music - интерфейс с методом скажиСвоюПесню(), который реализуют три класса

203
Группировка RecyclerView Android

Группировка RecyclerView Android

Здрaвcтвуйте! Подскажите пожалуйста, как мне сгруппировать recyclerview? Цифры слева на фото -это семестрыХочу сгруппировать по семестрам

151