powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / рекурсивная функция делает переполнение кучи.
25 сообщений из 132, страница 4 из 6
рекурсивная функция делает переполнение кучи.
    #39365961
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczandron81Blazkowicz,

то есть я сделал туфту ? )))
Просто самое время изучить что-то новое и уменьшить немного накал говнокода.
Да. Собственно для юноши-джуниора сейчас важно научится правильно
использовать инструмент разработки язык и среду. Скажу честно что я глубоко не разбирал его
алгоритм. Я даже не вижу толком как он работает. Единственно - машинально
отметил какую-то избыточность в return-параметрах (зачем они вообще там?)
и неумение делать простейшие трансформации кода для достижения краткости.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365968
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81mayton, хотел у Вас спросить .

Вот это имеет ли шанс на удачу или же чушь несусветная ?

andron81то есть вы предлагаете просто рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения (а они будут, но не велика проблема)

Давайте вернемся немножко к теории самой задачи.

Если вы планируете найти 1-е попавшееся решение - то вам пойдет вариант с запуском
десятка вычислительных потоков с разной старовой клеткой и с разным раскладом
"проб коня". Какой-то из потоков первый завершит работу - и это будет успех.

Второй вариант - вы хотите найти минимум N обходов. Нам также подходит этот алгоритм
единственный нюанс надо искать зеркальные отражения и повороты на 90 градусов
базового решения (это самые первые которое мы найдем) и учитывать их как не-уникальные.

Третий вариант - вы хотите искать все решений 100% покрытий конём доски.

Здесь я затрудняюсь. Я не знаю разумное ли это число? Возможно оно астрономически
велико. Но даже для такого варианта надо что-то предложить. Я здесь я предложу
еще раз рассмотреть все решения как набор деревьев 8-чатого порядка и просто
разрезать это множество на M частей и раздать это M потокам.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39365979
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81вот интересно послушать mayton .
Верно ли я его понял, что он предлагал обход дерева осуществлять не последовательно от ветки к ветке , а брать случайную. и всё это в нескольких потоках вести юзая разные массивы.
Это мозговой штурм. Я не говорю что это единственно верное решение.
Чтобы потоки не "лупили" по одним и тем-же маршрутам надо:

1) Инстанциировать потоки разной стартовой клеточкой. Например
new HorseThread(1,new Position("a1");
new HorseThread(2,new Position("g8");

2) При выборе следующего хода из одинаково вероятных "проб коня"
брать псевдослучайное число инстанциированное уникальным seed-ом.
Этот seed можно взять из порядкового номера потока (1,2,3,)

3) Как только все потоки сформируют теоретическое количество X ответов
(которое мы вычислим или вычитаем в умных книжках) то мы скажем
что все решения найдены и больше в природе не существует и прервем
работу всех потоков.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39366386
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton1) Инстанциировать потоки разной стартовой клеточкой. Например
new HorseThread(1,new Position("a1");
new HorseThread(2,new Position("g8");

не пойдет. старт должен исходить из одной определённой клетки - условие задачи.

maytonnew HorseThread(1,new Position("a1");
new HorseThread(2,new Position("g8");
...




потоки нагибают систему конкретненько.
попробовал с одним потоком поискать решения на полях 5x5 , 6x6 с разных начальных точек. ищет все решения и довольно быстро. а вот поля 7x7 ? 8x8 надолго сильно задумывается.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39366426
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81потоки нагибают систему конкретненько.
попробовал с одним потоком поискать решения на полях 5x5 , 6x6 с разных начальных точек. ищет все решения и довольно быстро. а вот поля 7x7 ? 8x8 надолго сильно задумывается.
Это норм. Так и нужно. Утилизация ибо. После топика рендеринга
картинок я пришел к выводу что для процессов которые интенсивно
используют CPU и почти не конкурируют по памяти (типа численный метод;
один раз получил задание и ушел в себя надолго) оптимальная формула
числа Java- потоков

Jt = m * n + 1

Где m - число ядер и n - число hyper-threads на ядро. Для моего слабого ноутбука
это было 5. Дальнейшее увеличение числа потоков не повышало эффективности
алгоритма.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39366428
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81не пойдет. старт должен исходить из одной определённой клетки - условие задачи.

Хорошо. Пускай они стартуют с одной точки. Тогда нам нужны несколько потоков
параметризованные только генератором случайных чисел с разным начальным вектором.

Код: java
1.
2.
3.
new HorseThread(new Random(1),new Position("a1");
new HorseThread(new Random(2),new Position("a1");
....
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39366769
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
мозговой штурм , а именно :
рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения" быстрых решений не приносит - более часа ни одного решения не найдено.
а оно даже немного и понятно. Ведь на каждом шаге 9 вариантов которые выбираются случайно (9 - выход на уровень выше). таким образом в данной ветке мы можем как сразу выйти к предку , так и побродить - 9-ка может не выпадать.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39366849
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

а про метод Варнсдорфа прочитал, что может в тупик заводить. контр.примеры писали что существуют.
остаётся метод деления дерева на поддеревья подсказанный mayton. но я не представляю как этот способ реализуется.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39366978
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81mayton,
мозговой штурм , а именно :
рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения" быстрых решений не приносит - более часа ни одного решения не найдено.
а оно даже немного и понятно. Ведь на каждом шаге 9 вариантов которые выбираются случайно (9 - выход на уровень выше). таким образом в данной ветке мы можем как сразу выйти к предку , так и побродить - 9-ка может не выпадать.
Ну и зачем ты сразу выходишь наверх? Обойди все восемь узлов дерева в рандом порядке.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39366995
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonandron81mayton,
мозговой штурм , а именно :
рандомно , а не последовательно как у нас выбирать следующего кандидата в разных независимых потоках. не ведя никаких проверок на совпадения" быстрых решений не приносит - более часа ни одного решения не найдено.
а оно даже немного и понятно. Ведь на каждом шаге 9 вариантов которые выбираются случайно (9 - выход на уровень выше). таким образом в данной ветке мы можем как сразу выйти к предку , так и побродить - 9-ка может не выпадать.
Ну и зачем ты сразу выходишь наверх? Обойди все восемь узлов дерева в рандом порядке.

нет, ну не сразу, а волею случая.
а вы уверены , что если проверять рандомно все 8 узлов и в случае ни одного успешного выходить на уровень выше, то это будет выигрыш по сравнению последовательного обхода ?
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367054
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81maytonпропущено...

Ну и зачем ты сразу выходишь наверх? Обойди все восемь узлов дерева в рандом порядке.

нет, ну не сразу, а волею случая.
а вы уверены , что если проверять рандомно все 8 узлов и в случае ни одного успешного выходить на уровень выше, то это будет выигрыш по сравнению последовательного обхода ?
А ты думал о том что при последовательном обходе у тебя все threads будут делать одну и ту же работу дублируя друг друга? И зачем такой параллелизм?
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367077
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА ты думал о том что при последовательном обходе у тебя все threads будут делать одну и ту же работу дублируя друг друга? И зачем такой параллелизм?

нет, конечно.

я думал и запрограммировал вот так :
пусть точка отсчета 1:1 во всех потоках.
в каждой вершине дерева случайно выбираем одно из возможных направлений + направление назад, делаем это в разных независимых потоках ( в результате будут разные маршруты). не ведя нигде никаких проверок на совпадения. таким образом в каждой вершине случайным образом выбирается одно из возможных направлений или может выбраться путь к предку назад.
Путь обратно может быть выбран как сразу так и потом , волей случайности .
Этот алгоритм успеха не принёс
вы же предлагаете рандомить возможные направления , а по их исчерпанию возвращаться назад.
Вот я и предположил , что вот последовательный ход по вершинам и случайный ход. И там и там обход всех вершин . поэтому и вопрос откуда такая уверенность , что последний приведёт к успеху.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367153
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81maytonА ты думал о том что при последовательном обходе у тебя все threads будут делать одну и ту же работу дублируя друг друга? И зачем такой параллелизм?

нет, конечно.

я думал и запрограммировал вот так :
пусть точка отсчета 1:1 во всех потоках.
в каждой вершине дерева случайно выбираем одно из возможных направлений + направление назад, делаем это в разных независимых потоках ( в результате будут разные маршруты). не ведя нигде никаких проверок на совпадения. таким образом в каждой вершине случайным образом выбирается одно из возможных направлений или может выбраться путь к предку назад.
Путь обратно может быть выбран как сразу так и потом , волей случайности .
Этот алгоритм успеха не принёс
вы же предлагаете рандомить возможные направления , а по их исчерпанию возвращаться назад.
Вот я и предположил , что вот последовательный ход по вершинам и случайный ход. И там и там обход всех вершин . поэтому и вопрос откуда такая уверенность , что последний приведёт к успеху.
Да ладно. Нигде я не предлагал ходить назад.

Я ещё раз предложу тебе публиковать актуальный исходник а то получается что мы просто ведем философской дискурс
Причём ты весьма вольно дополняешь мои мысли своими и потом говоришь театрально "успеха не принёс"..
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367223
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа ладно. Нигде я не предлагал ходить назад.


а тут ?

maytonНу и зачем ты сразу выходишь наверх? Обойди все восемь узлов дерева в рандом порядке.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367224
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

смутило слово "СРАЗУ" . словно ход назад вы всё же не отрицаете
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367230
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне лень спорить. Я-то свои мысли знаю. Мдя.

А с тебя - должок. Гони сорцы. :)
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367235
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
package horses;

import java.util.* ;

public class Horse implements Runnable {
	int lll=6;/*длина доски*/
	 int hourseCount = 65;
	    int[][] x = new int[lll+1][lll+1];
	    int[] is = new int[hourseCount];
	    int[] js = new int[hourseCount];
	    long depth = 0;
	    int thread_name;
	    int iStartPos ;
	    int jStartPos;
	 public Horse(int t,int iStartPos , int jStartPos )
			  {
		 thread_name=t;
		 x[iStartPos][jStartPos] = 1;
		 this.jStartPos=jStartPos ;
		 this.iStartPos=iStartPos;
	        is[1] = iStartPos;
	        js[1] = jStartPos;
	 }
	 
	 
	 public boolean tryHorse(int horseIndex) {
	        boolean success = true;
	        int[] moving;
	        int mc  = (int)(Math.random() * 8);
	        int x1;
	        int y1;
	        depth++;
	        //System.out.println("tryHorse("+horseIndex+")");
	        printState();
	       //logger.debug("Глубина = {}", depth);
	      
	        if (horseIndex == 2) {
	            x1 = this.iStartPos;
	            y1 = this.jStartPos;
	            is[horseIndex] = x1;
	            js[horseIndex] = y1;
	            printState();
	        }

	        do {
	            moving = moveHorse(mc, is[horseIndex - 1], js[horseIndex - 1]);
	            if (moving[0] != 0 && moving[1] != 0) { //если можно поставить коня
	                x1 = moving[0];
	                y1 = moving[1];

	                x[x1][y1] = horseIndex;/*ставим*/
	                is[horseIndex] = x1;
	                js[horseIndex] = y1;

	                //System.out.println("Можно !  Передвигаем коня на "+ x1+" "+y1 +" ход "+ horseIndex);
	                printState();
	                if (horseIndex >=lll*lll) 	{
	                	printState();}
	                if (horseIndex <= lll*lll+1) {
	                    success = tryHorse(horseIndex + 1);
	                } 
	                
	                	
	     
	                

	                
	                if (!success) {
	                	
	          //          logger.debug("Плохо !  Вынуждены убрать коня с x={} y={} ", is[horseIndex], js[horseIndex]);
	                printState();
	                    x[is[horseIndex]][js[horseIndex]] = 0;
	                    //System.out.println("Плохо !   Вынуждены убрать коня "+ is[horseIndex]+" "+js[horseIndex] +" ход ");
	                    is[horseIndex] = 0;
	                    js[horseIndex] = 0;
	                    success = true;
	                    
	                }
	            }
	            mc = (int)(Math.random() * 9);
	            if (mc == 8) {
	                success = false;
	            }
	        } while (!(!success || mc == 8));

	        depth--;

	        return success;
	    }

	    public int[] moveHorse(int i1, int i, int j) {
	    	int[][] horseMoves = {{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2}};
	        int[] result = new int[2];
	        result[0] = 0;
	        result[1] = 0;
	        int is;
	        int js;

	        //logger.debug("Попытка {} из 8. проверим можно ли передвинуть с {} {} ",i1, i, j);
	        if (i + horseMoves[i1][0] >= 1 && i + horseMoves[i1][0] <= lll &&
	            j + horseMoves[i1][1] >= 1 && j + horseMoves[i1][1] <= lll
	             && x[(i + horseMoves[i1][0])][(j + horseMoves[i1][1])] == 0
	        		) {
	        	
	            is = i + horseMoves[i1][0];
	            js = j +  horseMoves[i1][1];
	            result[0] = is;
	            result[1] = js;
	        	
	        }
	        
	        return result;
	    }

	    public void printState() {
	        
	    	System.out.println("Поток # "+thread_name);
	            for (int x = 1; x <= lll; x++) {
	                for (int y = 1; y <= lll; y++) {
	                    if (this.x[x][y] > 0) {
	                    	
	                    	System.out.print(this.x[x][y]+" ");

	                    } else if (this.x[x][y] < 0) {
	                     
	                        System.out.print("B ");
	                    } else if (this.x[x][y] == 0) {
	                        System.out.print("0 ");
	                    }
	                }
	                System.out.println();
	            }
	            System.out.println();
	    }
	
	public void run() {

//		 try{
			 tryHorse(2);
			 
//		 }catch(Exception e) {}

	}
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
package horses;

public class main {
	public static void main (String[] args) {
   
		Thread t1 = new Thread(new Horse(1,1,2));
		/*
		Thread t1 = new Thread(new Horse(1,5,5));
   Thread t2 = new Thread(new Horse(2,4,2));
   
   Thread t4 = new Thread(new Horse(4,3,2));
   Thread t5 = new Thread(new Horse(5,6,4));
   Thread t6 = new Thread(new Horse(6,1,3));
   Thread t7 = new Thread(new Horse(7,2,1));
   Thread t8 = new Thread(new Horse(8,3,4));
   */
		
   t1.start();
/*   t2.start();
   t3.start();
   t4.start();
   t5.start();
   t6.start();
   t7.start();
   t8.start();
  */ 
}
}
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367236
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну йошкин крот. Мой рефакторинг ты конечно проигнорировал.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367238
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу йошкин крот. Мой рефакторинг ты конечно проигнорировал.

так всё ужасно читается ?
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367251
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не в том дело. Яж тебе совет давал и по performance.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367721
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа не в том дело. Яж тебе совет давал и по performance.


1. System.out флудит беспощадно и блокирует скорость вычислений. Даже с заглушкой в /dev/null все равно
будет обеспечет терафлоп ненужной работы которую никто не смотрит. Вобщем вынести в slf4j или JUL с уровнем trace.

ну честно , я не увидел разницы по скорости с протоколированием slf4j. Если на то пошло можно принты и поотключать.
оставить только вывод матрицы. и протокол по средствам slf4j так же вызывает перегруз кучи.
на замене System.out.print протоколирование по средствам slf4j в данном случае не хотел бы заострять внимание.


2. Результат вычислений возвращается через строковую константу. Это странно. Так обычно не делают.

любезно с этим помогли. теперь булеан


3. Есть flow где имеет смысл добавить линию else чтобы отключить избыточные расчеты.
Есть повторы вычисления одного выражения которые можно зарефакторить через
introduce temp variable.

боюсь где-нибудь подкосячить добавлением Else . поэтому не делал.


4. Очень много замечаний к codeStyle. Классы с маленькой буквы а имена переменных с dash.
Это ломает зрение.

ну извиняюсь. пока мало опыта. Глаза разбегаются там от требований после того как погуглил. я это делать буду пол. дня.
пока как я должен по минимуму:
1) классы с большой буквы , переменные с маленькой и никаких подчеркиваний ?
2) в наименовании методов, классов, переменных использование английских слов.
подскажите , я перепишу
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39367990
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81ну извиняюсь. пока мало опыта.

Отличная отмазка чтобы ничего не делать.

andron81Глаза разбегаются там от требований после того как погуглил. я это делать буду пол. дня.

Ерунда. Переименовать все переменные через рефакторинг и попросить IDE отформатировать код. 15 минут, на придумать внятные имена.

andron81подскажите , я перепишу
Пример

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
int boardSize = 6;/*длина доски*/
int[][] board = new int[boardSize][boardSize];

int numberOfSteps = 65;
int[] stepTrailForPurpose = new int[numberOfSteps];
int[] stepTrailForAnotherPurpose = new int[numberOfSteps];
long depth = 0;
int threadName;
int purposeStartPosition ;
int anotherPurposeStartPosition;



Никаких mс, t, j, is, js, xs и прочих угадаек. Имя точно должно объяснять нафига тут эта переменная и что в ней.

i допускается только в циклах. Иногда можно сокращать b, s, c для временных переменных byte, String, char, но их область видимости должна быть минимальной - 2-3 рядом стоящие строки. У вас же такие переменные шатаются по всему коду.
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39368171
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron811. System.out флудит беспощадно и блокирует скорость вычислений. Даже с заглушкой в /dev/null все равно
будет обеспечет терафлоп ненужной работы которую никто не смотрит. Вобщем вынести в slf4j или JUL с уровнем trace.

ну честно , я не увидел разницы по скорости с протоколированием slf4j. Если на то пошло можно принты и поотключать.
оставить только вывод матрицы. и протокол по средствам slf4j так же вызывает перегруз кучи.
на замене System.out.print протоколирование по средствам slf4j в данном случае не хотел бы заострять внимание.

Смотри раз уж пошла такая пьянка. Давай сделаем так. Я помаркирую твой исходник секциями
Код: java
1.
// TODO: ....


и понадписываю что сделать в каждой строчке или блоке кода для улучшения перформанса.

И ты, позадавав уточняющие вопросы это сделаешь. А после этого запустишь еще этого
"блуждающего коня" померяешь эффект. И скажешь - помогло или нет. ОК?
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39368276
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, хокей !
...
Рейтинг: 0 / 0
рекурсивная функция делает переполнение кучи.
    #39368301
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Держи. Я поставил отметки TODO: только там где на мой взгляд имеет место
недостаток performance.

TODO не удаляй до тех пор пока фактически не будет
сделано по ним исправление. Задавай вопросы. Отвечу.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
package horses;

import java.util.* ;

public class Horse implements Runnable {
    int lll=6;/*длина доски*/
    int hourseCount = 65;
    // TODO: заименить int[][] x  на  int[] x. Переписать логику соотв.
    int[][] x = new int[lll+1][lll+1];
    int[] is = new int[hourseCount];
    int[] js = new int[hourseCount];
    long depth = 0;
    int thread_name;
    int iStartPos ;
    int jStartPos;
    public Horse(int t,int iStartPos , int jStartPos )
    {
        thread_name=t;
        x[iStartPos][jStartPos] = 1;
        this.jStartPos=jStartPos ;
        this.iStartPos=iStartPos;
        is[1] = iStartPos;
        js[1] = jStartPos;
    }


    public boolean tryHorse(int horseIndex) {
        boolean success = true;
        int[] moving;
        int mc  = (int)(Math.random() * 8);
        int x1;
        int y1;
        depth++;
        //System.out.println("tryHorse("+horseIndex+")");
        // TODO: Убрать printState()
        printState();
        //logger.debug("Глубина = {}", depth);

        if (horseIndex == 2) {
            x1 = this.iStartPos;
            y1 = this.jStartPos;
            is[horseIndex] = x1;
            js[horseIndex] = y1;
            // TODO: Убрать printState()
            printState();
        }

        do {
            moving = moveHorse(mc, is[horseIndex - 1], js[horseIndex - 1]);
            if (moving[0] != 0 && moving[1] != 0) { //если можно поставить коня
                x1 = moving[0];
                y1 = moving[1];

                x[x1][y1] = horseIndex;/*ставим*/
                is[horseIndex] = x1;
                js[horseIndex] = y1;
                // TODO: Убрать printState()
                //System.out.println("Можно !  Передвигаем коня на "+ x1+" "+y1 +" ход "+ horseIndex);
                printState();
                if (horseIndex >=lll*lll) 	{
                    // TODO: Оставить printState только там где найден вариант решения этой задачи.
                    printState();}
                if (horseIndex <= lll*lll+1) {
                    success = tryHorse(horseIndex + 1);
                }






                if (!success) {

                    //          logger.debug("Плохо !  Вынуждены убрать коня с x={} y={} ", is[horseIndex], js[horseIndex]);
                    // TODO: Убрать printState()
                    printState();
                    x[is[horseIndex]][js[horseIndex]] = 0;
                    //System.out.println("Плохо !   Вынуждены убрать коня "+ is[horseIndex]+" "+js[horseIndex] +" ход ");
                    is[horseIndex] = 0;
                    js[horseIndex] = 0;
                    success = true;

                }
            }
            mc = (int)(Math.random() * 9);
            if (mc == 8) {
                success = false;
            }
        } while (!(!success || mc == 8));

        depth--;

        return success;
    }

    // TODO: Сделать методом moveHorse inline. Отказаться от returnvalue.
    public int[] moveHorse(int i1, int i, int j) {
        // TODO: заименить horseMoves[][] x  на  одномерный массив int[] x, или два одномерных.
        int[][] horseMoves = {{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2}};
        int[] result = new int[2];
        result[0] = 0;
        result[1] = 0;
        int is;
        int js;

        //logger.debug("Попытка {} из 8. проверим можно ли передвинуть с {} {} ",i1, i, j);
        if (i + horseMoves[i1][0] >= 1 && i + horseMoves[i1][0] <= lll &&
                j + horseMoves[i1][1] >= 1 && j + horseMoves[i1][1] <= lll
                && x[(i + horseMoves[i1][0])][(j + horseMoves[i1][1])] == 0
                ) {

            is = i + horseMoves[i1][0];
            js = j +  horseMoves[i1][1];
            result[0] = is;
            result[1] = js;

        }

        return result;
    }

    public void printState() {

        System.out.println("Поток # "+thread_name);
        for (int x = 1; x <= lll; x++) {
            for (int y = 1; y <= lll; y++) {
                if (this.x[x][y] > 0) {

                    System.out.print(this.x[x][y]+" ");

                } else if (this.x[x][y] < 0) {

                    System.out.print("B ");
                } else if (this.x[x][y] == 0) {
                    System.out.print("0 ");
                }
            }
            System.out.println();
        }
        System.out.println();
    }

    public void run() {

//		 try{
        tryHorse(2);

//		 }catch(Exception e) {}

    }
}

...
Рейтинг: 0 / 0
25 сообщений из 132, страница 4 из 6
Форумы / Java [игнор отключен] [закрыт для гостей] / рекурсивная функция делает переполнение кучи.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]