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