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]
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:
Bunun için nereden başlamalıyım?
Ben diyeceğimi dedim. Bunun ilerisi adım adım söylemek.

Rastgele eleman eklemelide çakışma ne kadar sık oluyor diye kontrol ettiğimde o kadar çok oluyor ki 10-15 kere denememde bir kere olsun tamamı çakışmadan olmadı. En fazla 6 satır oldu.
 

Buraya yazdigin matrisin satir ve sutunlarinin yerlerini degistir.
Ornegin 3. ve 5. satirdaki array'i swap edersen hala valid kalir.
Ayni sekilde column swap da bozmaz duzeni.
Bu sekilde randomize etmek bence daha kolay, muhtemelen daha da hizli.
 
C de bilmiyorum da, Python da bactrack özelliği ile sudoku yapılıyordu diye hatırlıyorum.
 
Buraya yazdigin matrisin satir ve sutunlarinin yerlerini degistir.
Ornegin 3. ve 5. satirdaki array'i swap edersen hala valid kalir.
Ayni sekilde column swap da bozmaz duzeni.
Bu sekilde randomize etmek bence daha kolay, muhtemelen daha da hizli.
[CODE lang="c" title="C"]#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int satirda_varmi(int dizi[9][9], int i, int sayi)
{
for (int j = 0; j < 9; j++)
if (dizi[j] == sayi)
return 1;

return 0;
}

void satiri_doldur(int dizi[9][9], int i)
{
for (int j = 0; j < 9; j++)
{
int rastgele = rand() % 9 + 1;

if (satirda_varmi(dizi, i, rastgele) == 0)
dizi[j] = rastgele;

else
j--;
}
}

void diziyi_doldur(int dizi[9][9])
{
for (int i = 0; i < 9; i++)
satiri_doldur(dizi, i);
}

void diziyi_yazdir(int dizi[9][9])
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
printf("%d ", dizi[j]);

printf("\n");
}
}

int main()
{
srand(time(0));
int sudoku[9][9];

diziyi_doldur(sudoku);
diziyi_yazdir(sudoku);

return 0;
}[/CODE]

Arkadaşlar bu şekilde yaptım. Satırlarda artık tekrar etmiyor. Sütun kısmında da baya uğraştım ama bazı yerlerde mesela;
12.....
23....
31...
45....
54....
67..
78...
86....
9[]

bu şekilde giderken parantez olan yere kadar güzel gidiyor ama parantezde tıkanıyor.
Bunu çözmeye yeticek C bilgisi yok bende Gerçi buraya kadar da yoktu ama...
Sütun kısmına da yarın öbürgün bakarım. Yardımlarınız için teşekkürler. Bir de dediklerinizin çoğunu anlayamadım çünkü o terimleri vb. bilmiyorum kusura bakmayın. Sütun kısmında görüşürüz umarım :3 Yardımcı olacak, bakmam gereken C konuları vb. söyleyebilirseniz çok makbule geçer. İyi geceler.
Buraya yazdigin matrisin satir ve sutunlarinin yerlerini degistir.
Ornegin 3. ve 5. satirdaki array'i swap edersen hala valid kalir.
Ayni sekilde column swap da bozmaz duzeni.
Bu sekilde randomize etmek bence daha kolay, muhtemelen daha da hizli.
Bu dediğiniz çok mantıklı şimdi anladım. Sanırım direk bunu alıp sadece sütunların yerlerini değiştiren bi kod yazsam sürekli rastgele istediğim şey gelmiş olur. Bunu da ayrı olarak yapabilirim. İşin kolayına kaçmak gibi oluyor :3 Şuankini tamamlamayı düşünüyorum. Çok teşekkürler.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…