Задана полоска длиной 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();
}
}
Почему он не выдает нужный результат?
Решение найдено
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();
}
}
}
Вот на 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Нужно адаптировать метод из C# для JavaКак можно заменить ключевое слово ref в данной ситуации?
В интернете нашёл пример неправильного использования ThreadLocal переменной и внутренних классов
Есть класс MusicPlayer, у него есть поле List<Music> list , где Music - интерфейс с методом скажиСвоюПесню(), который реализуют три класса
Здрaвcтвуйте! Подскажите пожалуйста, как мне сгруппировать recyclerview? Цифры слева на фото -это семестрыХочу сгруппировать по семестрам