Problemas usando matrizes

Problema 1:

Faça um programa que leia n e os elementos de uma matriz inteira Anxn e verifica se a matriz A tem uma linha, coluna ou diagonal composta apenas por zeros.

Solução:

#include <stdio.h>
#define LIM 200

int main(){
  int A[LIM][LIM];
  int n,i,j,lzeros,czeros,dpzeros,dszeros,zero;
  
  printf("Digite n: ");
  scanf("%d", &n);

  printf("Digite os elementos da matriz:\n");
  for(i = 0; i < n; i++)
    for(j = 0; j < n; j++)
      scanf("%d", &A[i][j]);

  /*Verifica linhas:*/
  lzeros = 0;
  for(i = 0; i < n; i++){
    /*Verifica linha i:*/
    zero = 1;
    for(j = 0; j < n; j++){
      if(A[i][j] != 0){
        zero = 0;
        break;
      }
    }
    if(zero){
      lzeros = 1;
      break;
    }
  }  

  /*Verifica colunas:*/
  czeros = 0;
  for(j = 0; j < n; j++){
    /*Verifica coluna j:*/
    zero = 1;
    for(i = 0; i < n; i++){
      if(A[i][j] != 0){
        zero = 0;
        break;
      }
    }
    if(zero){
      czeros = 1;
      break;
    }
  }

  /*Verifica diagonal principal:*/
  dpzeros = 1;
  for(i = 0; i < n; i++){
    if(A[i][i] != 0){
      dpzeros = 0;
      break;
    }
  }

  /*Verifica diagonal secundária:*/
  dszeros = 1;
  for(j = 0, i = n-1; j < n; j++, i--){
    if(A[i][j] != 0){
      dszeros = 0;
      break;
    }
  }

  if(lzeros)
    printf("Linha zerada\n");
  if(czeros)
    printf("Coluna zerada\n");
  if(dpzeros)
    printf("Diagonal principal zerada\n");
  if(dszeros)
    printf("Diagonal secundária zerada\n");
    
  return 0;
}
  

Problema 2:

O jogo de palavras cruzadas é um passatempo bastante difundido. Consiste de várias linhas formadas por quadrados em branco, algumas na vertical e outras na horizontal, que se cruzam umas com as outras. Cada linha deve ser preenchida por uma palavra, e cada palavra deve ser descoberta através de dicas que acompanham as cruzadas. Ao se preencher uma das linhas, automaticamente se preenche alguns quadrados das outras linhas que a cruzam, tornando mais fácil sua resolução.

palavra cruzada

Um jogo de palavras cruzadas pode ser representado por uma matriz Amxn onde cada posição da matriz corresponde a um quadrado do jogo, sendo que 0 indica um quadrado branco e -1 indica um quadrado preto. Indicar na matriz as posições que são início de palavras horizontais e/ou verticais nos quadrados correspondentes (substituindo os zeros), considerando que uma palavra deve ter pelo menos duas letras. Para isso, numere consecutivamente tais posições.
Exemplo: Dada a matriz:

0 -1 0 -1 -1 0 -1 0
0 0 0 0 -1 0 0 0
0 0 -1 -1 0 0 -1 0
-1 0 0 0 0 -1 0 0
0 0 -1 0 0 0 -1 -1

A saída deverá ser:

1-1 2-1-1 3-1 4
5 6 0 0-1 7 0 0
8 0-1-1 9 0-1 0
-110 011 0-112 0
13 0-114 0 0-1-1

Solução:

#include <stdio.h>
#define LIM 100

int main(){
  int A[LIM][LIM];
  int m,n,i,j;
  int rotulo = 1, inic = 0;
  
  /*Lê matriz*/
  printf("Entre com m e n: ");
  scanf("%d %d",&m, &n);
  printf("Entre com os elementos:\n");
  for(i = 0; i < m; i++){
    for(j = 0; j < n; j++){
      scanf("%d", &A[i][j]);
    }
  }
  
  for(i = 0; i < m; i++){
    for(j = 0; j < n; j++){
      inic = 0;
      
      /*Testa início de palavras horizontais:*/
      if(A[i][j] == 0){
        if(j == 0){
          if(A[i][1] != -1)
            inic = 1;
        }
        else if(A[i][j-1] == -1 && j < n-1){
          if(A[i][j+1] != -1)
            inic = 1;
        }
      }
      /*Testa início de palavras verticais:*/
      if(A[i][j] == 0){
        if(i == 0){
          if(A[1][j] != -1)
            inic = 1;
        }
        else if(A[i-1][j] == -1 && i < m-1){
          if(A[i+1][j] != -1)
            inic = 1;
        }
      }
      
      if(inic == 1){
        A[i][j] = rotulo;
        rotulo++;
      }
    }
  }
  
  /*Imprime matriz:*/
  for(i = 0; i < m; i++){
    for(j = 0; j < n; j++){
      printf("%3d ", A[i][j]);
    }
    printf("\n");
  }
  return 0;
}