-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDay23s1.java
More file actions
217 lines (181 loc) · 7.44 KB
/
Day23s1.java
File metadata and controls
217 lines (181 loc) · 7.44 KB
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
import java.util.*;
/**
* Kelime Dönüştürme Oyunu Problemi
* Bu program, bir kelimeden başka bir kelimeye dönüşmek için
* her seferinde sadece bir harf değiştirerek en kısa yolu bulur.
* Örnek: "kalem" -> "kale" -> "kale" -> "kale" -> "kale"
*/
public class Day23s1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("*** KELİME DÖNÜŞTÜRME OYUNU ***");
System.out.println("Bir kelimeden başka bir kelimeye dönüşmek için en kısa yolu bulun.");
System.out.println("Her adımda sadece bir harf değiştirilebilir.");
System.out.println("Çıkmak için 'q' yazın.");
// Kelime listesini oluştur
Set<String> kelimeListesi = kelimeListesiOlustur();
while (true) {
System.out.print("\nBaşlangıç kelimesini girin: ");
String baslangicKelime = scanner.nextLine().toLowerCase();
if (baslangicKelime.equals("q")) {
break;
}
if (!kelimeListesi.contains(baslangicKelime)) {
System.out.println("Hata: Bu kelime listemizde yok!");
continue;
}
System.out.print("Hedef kelimeyi girin: ");
String hedefKelime = scanner.nextLine().toLowerCase();
if (hedefKelime.equals("q")) {
break;
}
if (!kelimeListesi.contains(hedefKelime)) {
System.out.println("Hata: Bu kelime listemizde yok!");
continue;
}
if (baslangicKelime.length() != hedefKelime.length()) {
System.out.println("Hata: Kelimeler aynı uzunlukta olmalıdır!");
continue;
}
// En kısa yolu bul
List<String> yol = enKisaYoluBul(baslangicKelime, hedefKelime, kelimeListesi);
if (yol == null) {
System.out.println("Bu kelimeler arasında dönüşüm yolu bulunamadı.");
} else {
System.out.println("\nDönüşüm yolu (" + (yol.size() - 1) + " adım):");
for (int i = 0; i < yol.size(); i++) {
System.out.println((i + 1) + ". " + yol.get(i));
if (i < yol.size() - 1) {
System.out.println(" ↓");
}
}
}
}
System.out.println("Oyun sonlandırıldı.");
scanner.close();
}
/**
* Örnek kelime listesi oluşturan metot
* Gerçek uygulamada bu liste daha büyük olabilir veya dosyadan okunabilir
*/
private static Set<String> kelimeListesiOlustur() {
Set<String> kelimeler = new HashSet<>();
// 3 harfli kelimeler
kelimeler.add("kal");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
// 4 harfli kelimeler
kelimeler.add("kalem");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
// 5 harfli kelimeler
kelimeler.add("kalem");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
kelimeler.add("kale");
return kelimeler;
}
/**
* İki kelime arasındaki en kısa dönüşüm yolunu bulan metot
* Genişlik öncelikli arama (BFS) algoritması kullanır
*/
private static List<String> enKisaYoluBul(String baslangic, String hedef, Set<String> kelimeListesi) {
// Eğer başlangıç ve hedef aynıysa, direkt dönüş
if (baslangic.equals(hedef)) {
List<String> yol = new ArrayList<>();
yol.add(baslangic);
return yol;
}
// BFS için kuyruk ve ziyaret edilen kelimeleri tutan set
Queue<String> kuyruk = new LinkedList<>();
Set<String> ziyaretEdilenler = new HashSet<>();
Map<String, String> oncekiKelime = new HashMap<>();
// Başlangıç kelimesini kuyruğa ekle
kuyruk.offer(baslangic);
ziyaretEdilenler.add(baslangic);
boolean yolBulundu = false;
// BFS döngüsü
while (!kuyruk.isEmpty() && !yolBulundu) {
String mevcutKelime = kuyruk.poll();
// Mevcut kelimeden oluşturulabilecek tüm kelimeleri kontrol et
for (String komsuKelime : komsuKelimeleriBul(mevcutKelime, kelimeListesi)) {
if (!ziyaretEdilenler.contains(komsuKelime)) {
kuyruk.offer(komsuKelime);
ziyaretEdilenler.add(komsuKelime);
oncekiKelime.put(komsuKelime, mevcutKelime);
// Hedef kelimeye ulaşıldıysa döngüyü sonlandır
if (komsuKelime.equals(hedef)) {
yolBulundu = true;
break;
}
}
}
}
// Yol bulunamadıysa null dön
if (!yolBulundu) {
return null;
}
// Yolu oluştur
List<String> yol = new ArrayList<>();
String mevcutKelime = hedef;
while (mevcutKelime != null) {
yol.add(0, mevcutKelime);
mevcutKelime = oncekiKelime.get(mevcutKelime);
}
return yol;
}
/**
* Verilen kelimeden bir harf değiştirilerek oluşturulabilecek
* ve kelime listesinde bulunan tüm kelimeleri bulan metot
*/
private static Set<String> komsuKelimeleriBul(String kelime, Set<String> kelimeListesi) {
Set<String> komsular = new HashSet<>();
// Her pozisyonda her harfi deneyerek yeni kelimeler oluştur
for (int i = 0; i < kelime.length(); i++) {
for (char c = 'a'; c <= 'z'; c++) {
// Mevcut harfi değiştir
String yeniKelime = kelime.substring(0, i) + c + kelime.substring(i + 1);
// Eğer yeni kelime listemizde varsa ve orijinal kelimeden farklıysa ekle
if (kelimeListesi.contains(yeniKelime) && !yeniKelime.equals(kelime)) {
komsular.add(yeniKelime);
}
}
}
return komsular;
}
/**
* İki kelime arasındaki farklı harf sayısını bulan yardımcı metot
*/
private static int farkliHarfSayisi(String kelime1, String kelime2) {
if (kelime1.length() != kelime2.length()) {
return -1; // Farklı uzunluktaki kelimeler için -1 dön
}
int farkSayisi = 0;
for (int i = 0; i < kelime1.length(); i++) {
if (kelime1.charAt(i) != kelime2.charAt(i)) {
farkSayisi++;
}
}
return farkSayisi;
}
}