C dilinde Satır ve Sütunda Birbirini Tekrar Etmeyen Rakamlar

Shaii

Femtopat
Katılım
27 Temmuz 2021
Mesajlar
4
Daha fazla  
Cinsiyet
Erkek
[CODE lang="c" title="C 9x9"]#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
srand(time(NULL));

for (int satir= 0; satir < 9

; satir++){
for (int sutun = 0; sutun < 9; sutun++){
int rakamlar = rand() % 9;
if (rakamlar < 10){
printf(" %d", rakamlar);
} else if (rakamlar >= 9 && rakamlar <= 9){
printf(" %d", rakamlar);
}
}
printf("\n");
}
return 0;
}[/CODE[/CODE]
[CODE lang="c" title="C 9x9"]#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
srand(time(NULL));

for (int satir= 0; satir < 9

; satir++){
for (int sutun = 0; sutun < 9; sutun++){
int rakamlar = rand() % 9;
if (rakamlar < 10){
printf(" %d", rakamlar);
} else if (rakamlar >= 9 && rakamlar <= 9){
printf(" %d", rakamlar);
}
}
printf("\n");
}
return 0;
}[/CODE[/CODE]
Burada 9x9 rastgele sayılar üretebilyorum ama her satır ve sütunda bir rakam sadece bir kere tekrar etmesini istiyorum. Bildiğimiz doldurulmuş bir sudoku çıkartsın karşıma. Her başlattığımda farklı bir görüntü istiyorum. Ayrıca burada 0'da çıkıyor. 0'ın olmaması lazım. Yardımcı olabilirseniz çok sevinirim.
 
Son düzenleme:
Sudoku rastgele sayılardan oluşmadığı için bahsettiğiniz şekilde mümkün değil. Gerçekleştirmesi mümkün ama rastgele olmaktan bence çok uzak olur.
Sayıyı hatırlamıyorum ama 16-17 bilgi gerekiyordu sanırım bir sudokuyu çözmek için. Bu da sizin rastgele seçebileceğiniz şeyler demek. Bilgiden kasıt neydi hatırlamıyorum ama 16-17 sayı değil, çok daha azı o kadar bilgiyi karşılıyor.
Bilgi veya ipucu şeklinde ifade edilse de sayı miktarı imiş ve 17 adetmiş. Bunun tüm sudokular için geçerli olmadığını da belirteyim. 50-60 belki çok daha fazla sayı olup tek çözümü olmayan sudokular mevcuttur.

İsterseniz her bir satırın rastgele [1, 9] aralığında olduğu 9x9'luk bir tablo hazırlayabilirim.
 
Random sayi oluşturan bir fonksiyon yapabilirsin, 1 ve 9 arasında sayı üretecek şekilde oluşturursun, daha sonra oluşturulan her sayıyı bir hafızada tutman lazım yeni oluşturulan random sayı bu sayılardan biri ise tekrar sayı oluşturmasını sağlayabilirsin, sonra da bu sayıları matrixe yerleştireceksin.
 
Eksik yazmışım,
int rakamlar = rand() % 9 +1;

olacaktı orası. Artık 9x9 1'den 9'a kadar rastgele oluyor. Olay sudoku değil, benzetme yaptım. Sadece satır ve sütunlarda birbirini tekrar etmemesi lazım. Yani bi sütunda ve satırda 1'den 9'a sadece 1 er tane olacak. Biraz yeniyim öğrenmek için böyle bir ödev verdim kendi kendime :D o yüzden direk yapılmış değil de, açıklanması ve yol gösterilmesi daha güzel olur. Teşekkürler.
Sudoku rastgele sayılardan oluşmadığı için bahsettiğiniz şekilde mümkün değil. Gerçekleştirmesi mümkün ama rastgele olmaktan bence çok uzak olur.
Sayıyı hatırlamıyorum ama 16-17 bilgi gerekiyordu sanırım bir sudokuyu çözmek için. Bu da sizin rastgele seçebileceğiniz şeyler demek. Bilgiden kasıt neydi hatırlamıyorum ama 16-17 sayı değil, çok daha azı o kadar bilgiyi karşılıyor.
Bilgi veya ipucu şeklinde ifade edilse de sayı miktarı imiş ve 17 adetmiş. Bunun tüm sudokular için geçerli olmadığını da belirteyim. 50-60 belki çok daha fazla sayı olup tek çözümü olmayan sudokular mevcuttur.

İsterseniz her bir satırın rastgele [1, 9] aralığında olduğu 9x9'luk bir tablo hazırlayabilirim.
functionA : 9 elemanli 1d arrayi 3x3 2d hale getirecek

functionB: Arrayi shuffle edecek

x = [1,2,3,4,5,6,7,8,9]
return functionA(functionB(x))
Ne demek istediğinizi tam olarak anlayamadım. Yani neden 9 tane 3x3 oluşturayım ki içinde? Bir 3x3 karede o sayı 1 defa olmak zorunda değil. Yani sudoku gibi düşündüyseniz o şekilde yapmama gerek yok. Hem tekrar etmemesini sağlayamam ki o şekilde.
 
Son düzenleme:
functionA : 9 elemanli 1d arrayi 3x3 2d hale getirecek.

functionB: Arrayi shuffle edecek.

x = [1,2,3,4,5,6,7,8,9]
return functionA(functionB(x))
Bu durumda 3x3'lük kısımlar eşsiz olsa da satır ve sütunlarda çakışma olmaz mı?

Olay sudoku değil, benzetme yaptım. Sadece satır ve sütunlarda birbirini tekrar etmemesi lazım.
3x3'lük kısımlarda tekrar olması sorun değil yani.
O zaman başta tahtanızı bir sayı ile (örneğin -1) doldurabilirsiniz. Sonra doldurmaya başlayın. Rastgele sayı seçin. Seçilen sayı satır ve sütunda yoksa yerleştirin. Varsa tekrar rastgele sayı çekin. Ama bu şekilde çok fazla çakışma olacaktır. Hatta şu örnek gerçekleştiğinde sonsuz döngüye girecektir:
İlk satır 123456789 oldu diyelim. İkinci satırda ilk 8 rakam farklı geldi ama 9. rakam aynı geldi. Yani 234567819. İkinci satırın ilk 8 rakamı çekilene kadar sorun yok ama 9. rakam için satır kontrolü yaparken sadece 9 rakamı çakışmıyor. O da sütunla çakışıyor.

Bu yüzden rastgele satır hazırlayıp o satırın tamamının önceki satırlarla çakışmasına bakmak daha mantıklı geliyor.
 
Eksik yazmışım,
int rakamlar = rand() % 9 +1;

olacaktı orası. Artık 9x9 1'den 9'a kadar rastgele oluyor. Olay sudoku değil, benzetme yaptım. Sadece satır ve sütunlarda birbirini tekrar etmemesi lazım. Yani bi sütunda ve satırda 1'den 9'a sadece 1 er tane olacak. Biraz yeniyim öğrenmek için böyle bir ödev verdim kendi kendime :D o yüzden direk yapılmış değil de, açıklanması ve yol gösterilmesi daha güzel olur. Teşekkürler.


Ne demek istediğinizi tam olarak anlayamadım. Yani neden 9 tane 3x3 oluşturayım ki içinde? Bir 3x3 karede o sayı 1 defa olmak zorunda değil. Yani sudoku gibi düşündüyseniz o şekilde yapmama gerek yok.

Tekrarsiz seri yapmak icin Set kullanmalisin normalde.
Bir baska "trick" yontem de ardisik liste olusturup shuffle etmek, elinde rastgele dizilmis tekrarsiz seri olacak bunu yaparsan.
 
Bu durumda 3x3'lük kısımlar eşsiz olsa da satır ve sütunlarda çakışma olmaz mı?

Satir ve sutundan kasit 3'lu 3x3 gruplar arasi cakisma mi?
Eger oysa evet olur. Ama sanki soruyu soran arkadasin problemi Sudoku generate etmek degil de unique liste olusturmak gibi geldi bana.
 
Tek yapmak istediğim her sütun ve satırda 1'den 9'a kadar sayılar birer kez tekrar ederek 9x9' luk bir tablo oluşturmak. Her çaıştırdığımda farklı bir tablo oluşturmasını istiyorum.

Örnek olarak;

123456789
234567891
345678912
456789123
567891234
678912345
789123456
891234567
912345678

Sanırım sayıları rastgele sırayla kontrol ederek o satır ve sütunda olmayan sayıları yazacak bir mekanizma kurmam gerekli. Bunun için nereden başlamalıyım? Yardımlarınız için teşekkürler.
 
Son düzenleme:

Geri
Yukarı