С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/50: Рейтинг темы: голосов - 50, средняя оценка - 4.98
8 / 8 / 0
Регистрация: 15.09.2010
Сообщений: 75

Широко известна игра "Города"

15.09.2010, 17:53. Показов 10840. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Широко известна игра "Города". Называется какой-нибудь город, допустим, "Саратов". Кончается на "в", значит требуется назвать другой город, у которого в названии первая буква "в". Это может быть "Воронеж". Следующий город должен начинаться на "ж" и т.д. Запрещено повторять название городов. Надо написать программу, которая из набора названий городов (все названия разные) строит цепочку максимальной длины.
Если алгоритм берет последнюю букву на которую нет города, то падает NullPointerException.
Как скипануть этот случай?
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
package olympicexercises;
 
import java.util.*;
import java.io.*;
 
public class CitiesSolver {
    final static List<String> cities = new ArrayList<String>();
    static Set<String> citiesSet;
 
    /**
     * Получение первой буквы для сравнения
     * @param city - город для выбора первой буквы
     * @return первая буква
     */
    public static Character getFirstChar(String city) {
        return city.charAt(0);
    }
 
    /**
     * Получение последней буквы для сравнения
     * @param city - город для выбора последней буквы
     * @return последняя буква
     */
    public static Character getLastChar(String city) {
        int pos = city.length() - 1;
        char lastChar = city.toUpperCase().charAt(pos);
        if (city.toUpperCase().charAt(pos) == 'Й') {
            return 'И';
        }
        else if (lastChar == 'Ь' || lastChar == 'Ы' || lastChar == 'Ъ') {
            pos--;
        }
        return city.toUpperCase().charAt(pos);
    }
 
    public static List<String> findLongestChain(Set<String> cities) {
        Map<Character, Set<String>> citiesIndex = createIndex(cities);
        return findLongestChain(citiesIndex);
    }
 
    /**
     * Рекурсия обхода дерева
     * @param citiesIndex коллекция городов для поиска
     * @return наиболее длинная цепочка из всех цепочек городов
     */
    private static List<String> findLongestChain(Map<Character, Set<String>> citiesIndex) {
        List<String> chain = new ArrayList<String>(0);
        for (Character firstChar : citiesIndex.keySet()) {
            List<String> newChain = findLongestChain(citiesIndex, firstChar);
            if (chain.size() < newChain.size()) {
                chain = newChain;
            }
        }
        return chain;
    }
 
    /**
     * Рекурсия обхода дерева
     * @param citiesIndex коллекция городов для поиска
     * @param firstChar первая буква для поиска города
     * @return цепочки городов
     */
    private static List<String> findLongestChain(Map<Character, Set<String>> citiesIndex, Character firstChar) {
        List<String> chain = new ArrayList<String>(0);
        for (String city : citiesIndex.get(firstChar)) {
            Map<Character, Set<String>> index = cloneIndex(citiesIndex); // работаем с копией коллекции городов
            index.get(firstChar).remove(city); // удаляем использованный город
            List<String> newChain = new ArrayList<String>(); // инициализация массива цепочки городов
            newChain.add(city); // добавление города в цепочку
            newChain.addAll(findLongestChain(index, getLastChar(city))); // добавление наиболее перспективных городов в цепочку
          if (chain.size() < newChain.size()) {  // выход из рекурсии
              chain = newChain;
          }
        }
        return chain;
    }
 
    /**
     * Создание копии коллекции городов
     * @param citiesIndex коллекция городов для копии
     * @return копия коллекции городов
     */
    private static Map<Character, Set<String>> cloneIndex(Map<Character, Set<String>> citiesIndex) {
        Map<Character, Set<String>> newIndex = new HashMap<Character, Set<String>>();
        for (Character key : citiesIndex.keySet()) {
            newIndex.put(key, new HashSet<String>(citiesIndex.get(key)));
        }
        return newIndex;
    }
 
    /**
     * Инициализация коллекции городов
     * @param cities города для инициализации
     * @return коллекция городов
     */
    private static Map<Character, Set<String>> createIndex(Set<String> cities) {
        Map<Character, Set<String>> index = new HashMap<Character, Set<String>>();
        for (String city : cities) {
            Set<String> cs = index.get(getFirstChar(city));
            if (cs == null) index.put(getFirstChar(city), cs = new HashSet<String>());
            cs.add(city);
        }
        return index;
    }
 
    public static void main(String[] args) throws IOException {
 
        // Загрузим города из файла
        final BufferedReader in = new BufferedReader(new FileReader("src/olympicexercises/cities2.txt"));
        for(String city; (city = in.readLine()) != null;) {
                cities.add(city); // и сложим все имена в этот массив
        }
        in.close();
 
        // Инициализация коллекции городов для поиска
        // key - первая буква города, value - имена городов начинающихся на эту букву
        Map<Character, Set<String>> citiesIndex = new HashMap<Character, Set<String>>();
        for (String city : cities) {
            citiesSet = citiesIndex.get(getFirstChar(city));
            if (citiesSet == null) {
            citiesSet = new TreeSet<String>();
            }
            citiesSet.add(city);
            citiesIndex.put(getFirstChar(city), citiesSet);
        }
        System.out.println("Список городов ("+ cities.size() + "): " + citiesIndex);
        System.out.println("--");
 
        for (String city : cities) {
            char firstChar = getLastChar(city);
            System.out.println("Корень дерева = " + city + ". Поиск города на '" + firstChar + "'.");
            List<String> longestChain = findLongestChain(citiesIndex, firstChar);
            System.out.println("Цепочка максимальной длины (" + longestChain.size() + "): " + longestChain + "\n--");
        }
        
        List<String> maxChain = findLongestChain(citiesIndex);
        System.out.println("Самая длинная из цепочек (" + maxChain.size() + "): " + maxChain);
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2010, 17:53
Ответы с готовыми решениями:

Игра в города
Нужно написать игру пожалуйста на java Игра заключается в том, что игроки по очереди называют города, при этом каждый следующий игрок...

Игра в города: учебная программа
Добрый день. Хочу написать простенькую учебную программу, что-то вроде игры в города. Думаю, сами города записать в файл. Возник...

Игра города. Версия с массивом символов
Ознакомившись с вариантами представленными на форуме не нашел ответов. Не могу понять как взять первый и последний символ из String ...

3
 Аватар для Norby
66 / 66 / 5
Регистрация: 12.03.2008
Сообщений: 392
15.09.2010, 22:08
Проверять что возвращает метод. Если null то пропускать.
1
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
16.09.2010, 06:51
А try{}catch{} уже никто не юзает?
1
8 / 8 / 0
Регистрация: 15.09.2010
Сообщений: 75
27.09.2010, 15:06  [ТС]
Допустим, существует набор городов "Абв", "Акв", "Вба": для данного набора городов возможны два варианта решения и в моем алгоритме будут вычеслены обе цепочки (хотя это не нужно), как оптимизировать алгоритм так чтобы при таком раскладе вычислялась только одна цепочка (не важно какая)?

Как оптимизировать решения для городов с одинаковыми первой и последней буквой ("Анапа")?
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
152
153
154
155
156
157
package olympicexercises;
 
import java.util.*;
import java.io.*;
 
 
public class CitiesSolver
{
  /**
   * Получение первой буквы для сравнения
   *
   * @param city - город для выбора первой буквы
   * @return первая буква
   */
  public static Character getFirstChar(String city)
  {
    return city.charAt(0);
  }
 
 
  /**
   * Получение последней буквы для сравнения, с пропуском "неправильных" букв
   *
   * @param city - город для выбора последней буквы
   * @return последняя буква
   */
  public static Character getLastChar(String city)
  {
    int pos = city.length() - 1;
    char lastChar = city.toUpperCase().charAt(pos);
    if (city.toUpperCase().charAt(pos) == 'Й') {
      return 'И';
    }
    else if (lastChar == 'Ь' || lastChar == 'Ы' || lastChar == 'Ъ') {
      pos--;
    }
    return city.toUpperCase().charAt(pos);
  }
 
 
  /**
   * Рекурсия обхода дерева
   *
   * @param cities - набор городов для инициализации коллекции
   * @return наиболее длинная цепочка из всех цепочек городов
   */
  public static List<String> findLongestChain(Set<String> cities)
  {
    Map<Character, Set<String>> citiesIndex = createIndex(cities);
    return findLongestChain(citiesIndex);
  }
 
 
  /**
   * Рекурсия обхода дерева
   *
   * @param citiesIndex - коллекция городов для поиска
   * @return наиболее длинная цепочка из всех цепочек городов
   */
  private static List<String> findLongestChain(Map<Character, Set<String>> citiesIndex)
  {
    List<String> chain = new ArrayList<String>(0);
    for (Character firstChar : citiesIndex.keySet()) {
      List<String> newChain = findLongestChain(citiesIndex, firstChar);
      System.out.println("Цепочка максимальной длины (" + newChain.size() + "): " + newChain + "\n==");
      if (chain.size() < newChain.size()) {
        chain = newChain;
      }
    }
    System.out.println("Самая длинная из цепочек (" + chain.size() + "): " + chain);
    return chain;
  }
 
 
  /**
   * Рекурсия обхода дерева
   *
   * @param citiesIndex - коллекция городов для поиска
   * @param firstChar - первая буква для поиска города
   * @return цепочки городов
   */
  private static List<String> findLongestChain(Map<Character, Set<String>> citiesIndex, Character firstChar)
  {
    List<String> chain = new ArrayList<String>(0);
    try {
      for (String city : citiesIndex.get(firstChar)) {
        Map<Character, Set<String>> index = cloneIndex(citiesIndex); // работаем с копией коллекции городов
        index.get(firstChar).remove(city); // удаляем использованный город
        List<String> newChain = new ArrayList<String>(); // инициализация массива цепочки городов
        newChain.add(city); // добавление города в цепочку
        newChain
            .addAll(findLongestChain(index, getLastChar(city))); // добавление наиболее перспективных городов в цепочку
        System.out.println("Прорабатывается цепочка (" + newChain.size() + "): " + newChain);
        if (chain.size() < newChain.size()) {  // выход из рекурсии
          chain = newChain;
        }
      }
    }
    catch (NullPointerException e) {
    }
    return chain;
  }
 
 
  /**
   * Создание копии коллекции городов
   *
   * @param citiesIndex - коллекция городов для копии
   * @return копия коллекции городов
   */
  private static Map<Character, Set<String>> cloneIndex(Map<Character, Set<String>> citiesIndex)
  {
    Map<Character, Set<String>> newIndex = new HashMap<Character, Set<String>>();
    for (Character key : citiesIndex.keySet()) {
      newIndex.put(key, new HashSet<String>(citiesIndex.get(key)));
    }
    return newIndex;
  }
 
 
  /**
   * Инициализация коллекции городов для поиска
   *
   * @param cities - города для инициализации
   * @return коллекция городов
   *
   * key - первая буква города, value - имена городов начинающихся на эту букву
   */
  private static Map<Character, Set<String>> createIndex(Set<String> cities)
  {
    Map<Character, Set<String>> index = new HashMap<Character, Set<String>>();
    for (String city : cities) {
      Set<String> cs = index.get(getFirstChar(city));
      if (cs == null) index.put(getFirstChar(city), cs = new HashSet<String>());
      cs.add(city);
    }
    return index;
  }
 
 
  public static void main(String[] args) throws IOException
  {
    final Set<String> cities = new HashSet<String>();
 
    // Загрузим города из файла
    final BufferedReader in = new BufferedReader(new FileReader("src/olympicexercises/cities2.txt"));
    for (String city; (city = in.readLine()) != null;) {
      cities.add(city); // и сложим все имена в этот массив
    }
    in.close();
    Set<String> sortedCities = new TreeSet<String>(cities);
    System.out.println("Список городов (" + sortedCities.size() + "): " + sortedCities);
    System.out.println("----------------------------");
 
    findLongestChain(cities);
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.09.2010, 15:06
Помогаю со студенческими работами здесь

Игра в "Города", не могу сделать так что бы города компьютер называл на рандом а не по списку
Самая обычная игра в города, нужно назвать город на последнюю букву соверника, но проблема в том что, компьютер называет города по порядку,...

Проверка корректности введенного города игра "Города"
Здравствуйте, пишу программку &quot;Города&quot;, т.е. пользователь называет какой-нибудь город, допустим, &quot;Омск&quot;. Компьютер считывает...

Игра в города
Пользователь (или несколько пользователей за одним компьютером) вводит слова. Начиная со второго введённого слова, программа проверяет,...

Игра в города
Собственно написал код: program game; var n, i, j : integer; wrd : array of string; {Тут храним слова} ...

Игра в города на С++
здраствуйте, мне нужна игра в города(Например: Москва-Архангельск, Архангельск-Казань и т.д), в которую можно было бы играть как Игрок vs...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru