Perdomo 0 Denunciar post Postado Julho 3, 2008 Pessoal, to com a seguinte dificuldade. Fiz o jogo sudoku para um trabalho da faculdade, so que usei uma matriz estatica, porem preciso fazer uma matriz randomica. Ao total tenho que colocar 27 numeros distribuidos entre os 3 quadrantes, respeitando a regra do jogo (o numero so pode estar uma vez na mesma linha, mesma coluna, mesmo quadrante. Alguem pode me ajudar? Abaixo o meu codigo #include<stdio.h> #include<stdlib.h> #define N 9 int op, numero ,linha, coluna; int grade1[N][N] = {{ 0, 6, 0, 1, 0, 4, 0, 5, 0}, { 0, 0, 8, 3, 0, 5, 6, 0, 0}, { 2, 0, 0, 0, 0, 0, 0, 0, 1}, { 8, 0, 0, 4, 0, 7, 0, 0, 6}, { 0, 0, 6, 0, 0, 0, 3, 0, 0}, { 7, 0, 0, 9, 0, 1, 0, 0, 4}, { 5, 0, 0, 0, 0, 0, 0, 0, 2}, { 0, 0, 7, 2, 0, 6, 9, 0, 0}, { 0, 4, 0, 5, 0, 8, 0, 7, 0}}; void desenha_grade() { int i,j; printf(" 1 2 3 4 5 6 7 8 9 \n"); printf("+---------+---------+---------+\n"); for (i = 0; i < N; i++) { printf("|"); for (j = 0; j < N; j++) { if (grade1[i][j] != 0) printf(" %d ", grade1[i][j]); else printf(" "); if (j % 3 == 2) printf("|"); } if (i % 3 == 2) printf("\n+---------+---------+---------+"); printf("\n"); } } int checar(int linha, int coluna, int numero) { if (grade1[linha][coluna]==0) return 1; else return 0; } int tenta_colocar(int i, int j, int k) { int c,l; for (l = 0; l < N; l++) if (grade1[l][j] == k) return 0; for (c = 0; c < N; c++) if (grade1[i][c] == k) return 0; for (l = i - i % 3; l < i - i % 3 +3; l++) for (c = j - j % 3; c < j - j % 3 + 3; c++) if (grade1[l][c] == k) return 0; grade1[i][j] = k; desenha_grade(); return 1; } int coordenadavalida(int linha, int coluna) { if(linha>=0 && linha <9 && coluna>=0 && coluna <9) return 1; else return 0; } int numerovalido(int numero) { if(numero>0 && numero <=9) return 1; else return 0; } int existenaColuna(int coluna, int numero) { for (int i=0; i<9; i++) { if (grade1[i][coluna] == numero) return 1; } } int existenalinha(int linha, int numero) { for (int j=0; j<9; j++) { if (grade1[linha][j] == numero) return 1; } } void escreve(int linha, int coluna, int numero) { grade1[linha][coluna]=numero; } void jogo() { printf("digite 0(ZERO) para sair"); if (coordenadavalida(linha-1, coluna-1)==1) { printf("Coordenada Valida\n"); if (numerovalido(numero)==1) { printf("Numero valido\n"); if (checar(linha-1, coluna-1, numero)==1) { printf("Posicao vazia\n"); if (tenta_colocar(linha-1, coluna-1, numero)==1) { printf("Quadrante OK\n"); escreve(linha-1,coluna-1,numero); printf("Gravado\n"); system("cls"); } else { printf("Nao foi possivel, ja existe na linha ou na coluna ou no mesmo quadrante\n"); } } else { printf("Posicao ja esta ocupada\n"); } } else { printf("Numero invalido\n"); } } else { printf("Coordenada invalida\n"); } } int terminar() { for (int i=0;i<9;i++) for (int j=0;j<9;j++) if (grade1[i][j]==0) return 1; } void geratela() { desenha_grade(); printf("Digite uma linha: "); scanf("%d", &linha); printf("Digite uma coluna: "); scanf("%d", &coluna); printf("Digite o numero: "); scanf("%d", &numero); jogo(); } int main() { printf("LUSOKU\n\n\n"); branco(); printf("REGRAS DO JOGO\n"); printf("O objetivo do jogo e completar todos os quadrados utilizando\n"); printf("numeros de 1 a 9. Para completa-los, seguiremos a seguinte regra: \n"); printf("Nao podem haver numeros repetidos nas linhas horizontais e verticais, \n"); printf("assim como nos quadrados grandes.\n\n\n"); while(terminar()!=0) { geratela(); terminar(); } } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 3, 2008 Leia sobre srand,rand e random. Compartilhar este post Link para o post Compartilhar em outros sites
Perdomo 0 Denunciar post Postado Julho 3, 2008 Leia sobre srand,rand e random. Cara, obrigado pela ajuda, ja sabia que eu tinha que usar o random mas nao sabia como, aí li a explicacao no CBRASIL, deusulivre!! alumiou as ideia!! Valeu! []´s Igor Perdomo Compartilhar este post Link para o post Compartilhar em outros sites
Perdomo 0 Denunciar post Postado Julho 4, 2008 Leia sobre srand,rand e random. Cara, obrigado pela ajuda, ja sabia que eu tinha que usar o random mas nao sabia como, aí li a explicacao no CBRASIL, deusulivre!! alumiou as ideia!! Valeu! []´s Igor Perdomo Tche, minhas ideias nao se alumiaram tanto assim, consegui gerar a matriz mas nao consigo fazer com que ela respeite a regra do sudoku(linha, coluna e quadrante). Podem me ajudar. void desenha_grade() { int i,j; printf(" 1 2 3 4 5 6 7 8 9 \n"); printf("+---------+---------+---------+\n"); srand(10); for (i = 0; i < N; i++) { printf("|"); for (j = 0; j < N; j++) { if (grade1[i][j] != 0) printf(" %d ", grade1[i][j], "%d" ,rand()%9); else printf(" "); if (j % 3 == 2) printf("|"); } if (i % 3 == 2) printf("\n+---------+---------+---------+"); printf("\n"); } } Compartilhar este post Link para o post Compartilhar em outros sites
Perdomo 0 Denunciar post Postado Julho 4, 2008 Leia sobre srand,rand e random. Cara, obrigado pela ajuda, ja sabia que eu tinha que usar o random mas nao sabia como, aí li a explicacao no CBRASIL, deusulivre!! alumiou as ideia!! Valeu! []´s Igor Perdomo Tche, primeiro, desculpa pelo cara, nao li direito o teu nome:P. minhas ideias nao se alumiaram tanto assim, consegui gerar a matriz randomica mas nao consigo fazer com que ela respeite a regra do sudoku(linha, coluna e quadrante). Podem me ajudar. void desenha_grade() { int i,j; printf(" 1 2 3 4 5 6 7 8 9 \n"); printf("+---------+---------+---------+\n"); srand(10); for (i = 0; i < N; i++) { printf("|"); for (j = 0; j < N; j++) { if (grade1[i][j] != 0) printf(" %d ", grade1[i][j], "%d" ,rand()%9); else printf(" "); if (j % 3 == 2) printf("|"); } if (i % 3 == 2) printf("\n+---------+---------+---------+"); printf("\n"); } } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Julho 4, 2008 você tem submatrizes no negocio...cada uma é 3x3. quando você gera um numero de 1 a 9,você tem que percorrer a linha e a coluna inteiras pra ver se ja existe.Se nao existir,entao coloque o numero la. Pra delimitar onde você pode colocar o numero: matriz grande: indices i e j. submatrizes: inicio e final sao multiplos de 3. se você tem N submatrizes, entao você tem um for de 1 a N pra conferir em todas. No meio de tudo existem loops com inicio e termino em multiplos de 3. Compartilhar este post Link para o post Compartilhar em outros sites