Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Разные мОтематические задачки и быдло-кодинг.
Список форумов
 ->  Основы языка Java


На страницу 1, 2, 3  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Stormer : 11
Новичок

СообщениеДек 16, 2011 14:08 
Ответить с цитатой
Тут я буду выкладывать свои "чудо"-наработки.

Начнём, пожалуй.

Программа строит поле размером game_size*game_size.
В каждую позицию рандомно заполняет 1, либо -1.

А потом считает, сколько получилось пятерок 1 или -1 (аналог крестиков-ноликов на большом поле) по вертикали/горизонтали/диагонали.

(Прим. 6 подряд идущих единиц засчитаются за 2 пятерки).

Если кто-то мне скажет про "повторяющиеся" куски кода, то пусть либо топает мимо, либо попробует хотя бы одну диагональ загнать в один цикл.

Может быть получится... У одного из 1000.
Итак, вспомогательный класс:

Код:
public class wr{
    public void wr (long s) {
        System.out.println(s);
    }
    public void wr1 (long s) {
        System.out.print(s);
    }
    public void wr (String s) {
        System.out.println(s);
    }
    public void wr1 (String s) {
        System.out.print(s);
    }
    public void wr (int s) {
        System.out.println(s);
    }
    public void wr1 (int s) {
        System.out.print(s);
    }
    public void wr (boolean s) {
        System.out.println(s);
    }
    public void wr1 (boolean s) {
        System.out.print(s);
    }
}


Основной класс:

Код:
import java.util.Random;

class GameConstructor {
    public int[][] buildField (int n){
        int[][] field = new int[n][n];
        Random checking = new Random ();
        int check_var = 0;
        for (int i=0; i<n; i++) {
            for (int j=0; j<n; j++) {
                check_var=checking.nextInt(2);
                if (check_var==0) {
                    field[i][j]=-1;} else
                    field[i][j]=1;                   
                if (field[i][j]==-1) {
                    if (j==n-1) {
                        new wr().wr(field[i][j]);
                    } else
                        new wr().wr1(field[i][j]+"  ");
                    } else
                if (j==n-1) {
                    new wr().wr(" "+field[i][j]);
                } else
                    new wr().wr1(" "+field[i][j]+"  ");
            }
        }
    return field;
    }   
}

class Checker {
    int[][] a;
    int zeroNumber=0;
    int crossNumber=0;
    void check_position (int sign_ver, int sign_hor, int ver, int hor) {
        byte inner_counter=0;
        for (int v=0; v<5; v++) {
            if (a[ver+v*(sign_ver)][hor+v*(sign_hor)]==1)
                inner_counter++; else
                inner_counter--;
        }
        if (inner_counter==5)
            crossNumber++;
        if (inner_counter==-5)
            zeroNumber++;
    }
    public void numberOfIntersections (int[][] a){
        this.a=a;
        //Horizontal:
        for (int j=0; j<a.length; j++){
            for (int i=0; i<a.length-4; i++) {
                check_position(1,0,i,j);
            }
        }
        //Vertical:
        for (int i=0; i<a.length; i++){
            for (int j=0; j<a.length-4; j++) {
                check_position(0,1,i,j);
            }
        }
        // The first diagonal part 1:
        for (int j=4; j<a.length; j++) {
            for (int k=0; k<j-3; k++) {
                check_position(1,-1,k,j-k);
            }
        }
        // The first diagonal part 2:
        for (int j=1; j<a.length-4; j++) {
            for (int k=a.length-1; k>j+3; k--) {
                check_position(-1,1,k,j-1+a.length-k);
            }
        }
        // The second diagonal part 1:
        for (int i=4; i<a.length;i++) {
            for (int k=a.length-1; k>a.length-i+2;k--) {
                check_position(-1,-1,i-a.length+k+1,k);
            }
        }
        // The second diagonal part 2:
        for (int i=a.length-5; i>0; i--) {
            for (int k=0; k<a.length-i-4; k++) {
                check_position(1,1,i+k,k);
            }
        }
    }
    public int crossNumber (){
        return crossNumber;
    }
    public int zeroNumber (){
        return zeroNumber;
    }
}

public class PlayField {
    public static void main (String[] args) {
        int game_size=6; //размеры поля
        GameConstructor game = new GameConstructor();   
        Checker checker = new Checker();
        checker.numberOfIntersections(game.buildField(game_size));
        new wr().wr("Количество пятерок крестиков: "+checker.crossNumber);
        new wr().wr("Количество пятерок ноликов: "+checker.zeroNumber);
    }
}


P.s. насчёт оформления кода критика принимается. В оформлении я не силён.
Насчёт оптимизации отклоняется, и авторы таких сообщений идут лесом. Ибо тут 95% как минимум мозг сломает, увидев первые же индексы, и даже не поймёт, что происходит в программе, даю гарантию.


Последний раз редактировалось: Stormer (Дек 16, 2011 14:25), всего редактировалось 1 раз
К началу Посмотреть профиль Отправить личное сообщение
Evgin : 748
Постоянный посетитель
Откуда: (SPB)

СообщениеДек 16, 2011 14:19 
Ответить с цитатой
Stormer писал(а):
Тут я буду выкладывать свои "чудо"-наработки.


Если верить заголовку темы - вам лучше сразу сюда: http://govnokod.ru/
_________________
Велюровый Петон приветствует Вас :-*
----------------------------
Кроме того, я думаю, что Карфаген должен быть разрушен!!!
----------------------------
javax.swing.JDesktopPane <--- Печаль
----------------------------
НЕ ФЛУДИ, КОМРАД!
К началу Посмотреть профиль Отправить личное сообщение
Stormer : 11
Новичок

СообщениеДек 16, 2011 14:27 
Ответить с цитатой
Evgin писал(а):
Stormer писал(а):
Тут я буду выкладывать свои "чудо"-наработки.


Если верить заголовку темы - вам лучше сразу сюда: http://govnokod.ru/


Посылаю Вас туда же или еще дальше - как Вам будет угодно.
К началу Посмотреть профиль Отправить личное сообщение
nullvoid : 505
Постоянный посетитель
Откуда: Красноярск

СообщениеДек 16, 2011 14:34 
Ответить с цитатой
Аффтар жги ещё Very Happy
_________________
http://LinguaLeo.ru/r/8b3o08
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Петр : 707
Постоянный посетитель
Откуда: Москва

СообщениеДек 16, 2011 14:50 
Ответить с цитатой
в любом случае молодец что что то делаешь.
но задача сильно простая.
а можешь сделать вот такую задачу.
есть радномное поле из 1 и 0
нужно определить самое большое множество единиц.
например

0 0 0 1 1 1
1 1 0 1 1 0
1 0 0 0 0 0
1 0 0 0 1 1
1 1 1 1 1 0
0 0 0 0 0 0

наибольшее множество 11. Smile
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
stolzen : 422
Бывалый
Откуда: Нижний Новгород

СообщениеДек 16, 2011 14:53 
Ответить с цитатой
В коллекцию чудо-наработок - http://pastebin.com/nxuSdfdq
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Stormer : 11
Новичок

СообщениеДек 16, 2011 14:56 
Ответить с цитатой
Петр писал(а):
в любом случае молодец что что то делаешь.
но задача сильно простая.
а можешь сделать вот такую задачу.
есть радномное поле из 1 и 0
нужно определить самое большое множество единиц.
например

0 0 0 1 1 1
1 1 0 1 1 0
1 0 0 0 0 0
1 0 0 0 1 1
1 1 1 1 1 0
0 0 0 0 0 0

наибольшее множество 11. Smile


Спасибо.

Прошу прощения, но постановка вопроса не очень корректна.
Что значит "самое большое множество единиц"?
Строка/столбец, сод. наиб. их число? Или что? Надо формализовать.

Да, и Ваша задача слишком простая.
К началу Посмотреть профиль Отправить личное сообщение
Петр : 707
Постоянный посетитель
Откуда: Москва

СообщениеДек 16, 2011 14:58 
Ответить с цитатой
соединение единиц. то есть множесвтво.
если просто то прошу показать решение.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Stormer : 11
Новичок

СообщениеДек 16, 2011 15:06 
Ответить с цитатой
Петр писал(а):
соединение единиц. то есть множесвтво.
если просто то прошу показать решение.


Но в том примере, который Вы привели, наибольшее такое "множество" единиц - явно не 11. Посмотрите внимательнее, сколько максимум идёт подряд единиц.

Второе: т.е. задача уже обретает смысл: найти строку/столбец максимальной длины, состоящий только из единиц.

А если оперировать словами множество, то множество может быть и таким например:
111
11
1111111
11

Как Вы будете сранивать два множества такого рода на предмет того, какое из них больше? То, в котором больше единиц? Или то которое больше в ширину или в высоту?

Поэтому сначала надо определить, какого множество вида, а потом определить его меру.
К началу Посмотреть профиль Отправить личное сообщение
Петр : 707
Постоянный посетитель
Откуда: Москва

СообщениеДек 16, 2011 15:11 
Ответить с цитатой
есть поле
0 0 0 1 1 1
1 1 0 1 1 0
1 0 0 0 0 0
1 0 0 0 1 1
1 1 1 1 1 0
0 0 0 0 0 0

имеем множество 1.
0 0 0 1 1 1
1 1 0 1 1 0
1 0 0 0 0 0
1 0 0 0 1 1
1 1 1 1 1 0
0 0 0 0 0 0

кол-во входящих единиц 5

множество 2.
0 0 0 1 1 1
1 1 0 1 1 0
1 0 0 0 0 0
1 0 0 0 1 1
1 1 1 1 1 0
0 0 0 0 0 0
кол-во входящих единиц 11.

могу привести еще пример если надо. но вроде все понятно.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Stormer : 11
Новичок

СообщениеДек 16, 2011 15:16 
Ответить с цитатой
Петр писал(а):
есть поле
0 0 0 1 1 1
1 1 0 1 1 0
1 0 0 0 0 0
1 0 0 0 1 1
1 1 1 1 1 0
0 0 0 0 0 0

имеем множество 1.

1 1 1
1 1

кол-во входящих единиц 5

множество 2.

1 1
1
1 1 1
1 1 1 1 1

кол-во входящих единиц 11.

могу привести еще пример если надо. но вроде все понятно.


Да, хорошо, согласен. Но не сказано, как соединяются множества.
Только по вертикали и горизонтали или по диагонали еще могут?

А мера множества значит - просто кол-во единиц в нём. Чем больше единиц, тем оно "больше". Так?
К началу Посмотреть профиль Отправить личное сообщение
Петр : 707
Постоянный посетитель
Откуда: Москва

СообщениеДек 16, 2011 15:18 
Ответить с цитатой
я подредактировал предыдущее сообщение. там понятно как нужно определять множество.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Stormer : 11
Новичок

СообщениеДек 16, 2011 15:27 
Ответить с цитатой
Петр писал(а):
я подредактировал предыдущее сообщение. там понятно как нужно определять множество.


Я имею в виду, вот так оно например может соединяться?

0 0 0 1 1 1
0 1 0 1 1 0
1 0 0 0 0 0
1 0 0 0 0 1
1 1 1 1 1 0
0 0 0 0 0 0
К началу Посмотреть профиль Отправить личное сообщение
Петр : 707
Постоянный посетитель
Откуда: Москва

СообщениеДек 16, 2011 15:29 
Ответить с цитатой
сделайте сначало что не может. то есть только горизонтальное или вертикальне примыкание. а потом уже можите и диагональное. это ж сложнее.
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
PolarHare : 182
Новичок
Откуда: Saint-Petersburg, Russia

СообщениеДек 16, 2011 18:45 
Ответить с цитатой
А разницы между есть/нету диагоналей? Это же просто поиск в ширину/покраска компонент связности. Ну разве что меньше массивы возможных ходов в два раза, но сам код не меняется. (ну или в два раза меньше копипаста, если массивы dx dy уже не модно)
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
 
Начать новую тему  Ответить на тему
Страница 1 из 3
На страницу 1, 2, 3  След.
Список форумов
 -> Основы языка Java


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru