Цветной дождь - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужно чтобы мосты были покрашены в цвет холмов, которые они соединяют. К сожалению, если холмы разного цвета, то покрасить мост таким образом не удастся. Посчитайте количество таких «плохих» мостов. Входные данные В файле INPUT.TXT в первой строке записано N (0 < N ≤ 100) – число холмов. Далее идет матрица смежности, описывающая наличие мостов между холмами (1 – мост есть, 0 – нет). Предпоследняя строка пустая, а в последней строке* записано N чисел, обозначающих цвет холмов: 1 – красный; 2 – синий; 3 – зеленый. Получается как-то так:
#include <stdio.h>
main(){
       FILE *in,*out;
       in=fopen("input.txt","r");
       out=fopen("output.txt","w");
       char N[101][101];
       char f[101];
       int n,i,j,x;
       x=0;
       fscanf(in,"%d",&n);
       for(i=0;i<n;i++){
       for(j=0;j<n;j++){
       fscanf(in,"%d",&N[i][j]);
       }
       }
       for(i=0;i<n;i++)
       fgets(&f[i],n+2,in);
       
       for(i=0;i<n;i++){
       for(j=0;j<n;j++){
       if(N[i][j] == 1 && f[i]!=*N[i]){
                  x++;
                  }
                  }
                  }
n/=2;
fprintf(out,"%d",x);
fclose(in);
fclose(out);
}
Пример: 7 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 1 1 3 3 Вывод 16, заместо 3.. Скорее всего неправильно считал массив f[i] из последней строки.. как это сделать?
Сделал так:
#include <stdio.h>
main(){
       FILE *in,*out;
       in=fopen("input.txt","r");
       out=fopen("output.txt","w");
       char N[101][101];
       char f[101][101];
       int n,i,j,x;
       x=0;
       fscanf(in,"%d",&n);
       for(i=0;i<n;i++){
       for(j=0;j<n;j++){
       fscanf(in,"%d",&N[i][j]);
       }
       }
       for(i=0;i<n;i++){
       j=n+3;
       fscanf(in,"%d",&f[i][j]);
       }
       
       for(i=0;i<n;i++){
       for(j=0;j<n;j++){
       if(N[i][j] == 1 && f[i][j]!=*N[i]){
                  x++;
                  }
                  }
                  }
n/=2;
fprintf(out,"%d",x);
fclose(in);
fclose(out);
}
Вроде все верно, только думаю, что где-то ошибка.. Кстати в примере должно получаться 4.. Или все таки все правильно?

Решение задачи: «Цветной дождь»

textual
Листинг программы
#include <stdio.h>
main(){
       FILE *in,*out;
       in=fopen("input.txt","r");
       out=fopen("output.txt","w");
       char N[101][101];
       char f[101];
       int n,i,j,x;
       x=0;
       fscanf(in,"%d",&n);
       for(i=0;i<n;i++){
       for(j=0;j<n;j++){
       fscanf(in,"%d",&N[i][j]);
       }
       }
       for(i=0;i<n;i++){
       fscanf(in,"%d",&f[i]);
       }
       
       for(i=0;i<n;i++){
       for(j=0;j<n;j++){
       if(N[i][j] == 1 && f[i]!=f[j]){
                  x++;
                  }
                  }
                  }
x/=2;
fprintf(out,"%d",x);
fclose(in);
fclose(out);
}

Объяснение кода листинга программы

  1. Объявляются и инициализируются переменные: FILE in,out; in=fopen(input.txt,r); out=fopen(output.txt,w); char N[101][101]; char f[101]; int n,i,j,x; x=0;
  2. Открываются файлы для чтения и записи: in=fopen(input.txt,r); out=fopen(output.txt,w);
  3. Задается размер массива N и f: n=101;
  4. Читаются данные из файла input.txt: fscanf(in,%d,&n); for(i=0;i<n;i++){ for(j=0;j<n;j++){ fscanf(in,%d,&N[i][j]); } } for(i=0;i<n;i++){ fscanf(in,%d,&f[i]); }
  5. Происходит проверка и подсчет количества цветных точек: for(i=0;i<n;i++){ for(j=0;j<n;j++){ if(N[i][j] == 1 && f[i]!=f[j]){ x++; } } }
  6. Выполняется операция деления на 2: x/=2;
  7. Результат выводится в файл output.txt: fprintf(out,%d,x);
  8. Файлы закрываются: fclose(in); fclose(out);
  9. Программа завершается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5