Форум программистов, компьютерный форум CyberForum.ru

массивы(заполнение и запись в файл) - C++

Восстановить пароль Регистрация
 
Dimaskorik
0 / 0 / 0
Регистрация: 29.09.2010
Сообщений: 28
05.11.2010, 07:14     массивы(заполнение и запись в файл) #1
Подскажите с решением на с++

Пруд с водой. Предположим, что целая матрица - это пруд с водой. В любое место пруда бросают камешек. Место попадания обозначим цифрой 0. От камушка по воде расходятся круги в виде цифр 1, 2, 3, ….. Написать программу для формирования поверхности пру-да после попадания камушка в любую точку пруда, т.е. матрицу А(m, n) заполнить следующим образом: для заданных k и r элементу Аkr присвоить значение 0; элементам, окаймляющим его (соседним с ним) – значение 1; элементам следующего окаймления – значение 2 и так далее до заполнения всей матрицы. Записать полученную матрицу в файл.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.11.2010, 07:30     массивы(заполнение и запись в файл) #2
сделай для поля 3x3 с камнем в центре
по ходу нужна рекурсивная функция ещё
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
05.11.2010, 13:24     массивы(заполнение и запись в файл) #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <fstream>
#include <iomanip>
#include <ctime>
 
int **myAlloc(int n, int m);
void myFree(int **matr, int n);
int max(int a, int b);
int min(int a, int b);
void border(int **matr, int I, int J, int N, int n, int m);
void fill(int **matr, int I, int J, int n, int m);
 
int main()
{
    int n, m;
 
    std::cout << "Enter n: ";
    std::cin >> n;
    std::cout << "Enter m: ";
    std::cin >> m;
 
    int **pond = myAlloc(n, m);
    
    srand(static_cast<unsigned>(time(0)));
 
    int I = n * rand() / RAND_MAX;
    int J = m * rand() / RAND_MAX;
 
    fill(pond, I, J, n, m);
 
    std::ofstream fout("pond.txt");
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            fout << std::setw(2) << pond[i][j] << " ";
 
        fout << std::endl;
    }
 
    myFree(pond, n);
 
    return 0;
}
 
int **myAlloc(int n, int m)
{
    int **matr = new int *[n];
 
    for (int i = 0; i < n; i++)
        matr[i] = new int [m];
 
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            matr[i][j] = 0;
 
    return matr;
}
 
void myFree(int **matr, int n)
{
    for (int i = 0; i < n; i++)
        delete [] matr[i];
 
    delete [] matr;
}
 
int max(int a, int b)
{
    return a > b ? a : b;
}
 
int min(int a, int b)
{
    return a < b ? a : b;
}
 
void border(int **matr, int I, int J, int N, int n, int m)
{
    int minJ = min(J + N, m - 1);
    int minI = min(I + N, n - 1);
 
    if (I - N >= 0)
        for (int j = max(J - N, 0); j <= minJ; j++)
            matr[I - N][j] = N;
 
    if (I + N <= n - 1)
        for (int j = max(J - N, 0); j <= minJ; j++)
            matr[I + N][j] = N;
 
    if (J - N >= 0)
        for (int i = max(I - N, 0); i <= minI; i++)
            matr[i][J - N] = N;
 
    if (J + N <= m - 1)
        for (int i = max(I - N, 0); i <= minI; i++)
            matr[i][J + N] = N;
}
 
void fill(int **matr, int I, int J, int n, int m)
{
    int N = 1;
 
    do
    {
        border(matr, I, J, N++, n, m);
    }
    while (N != max(n, m));
}
Добавлено через 10 минут
Только что-то никак не могу придумать нормального условия выхода из цикла в функции fill, поэтому сделал такое (чтобы наверняка заполняло всю матрицу, но 99% будут лишние итерации)
Рыжий Лис
Просто Лис
 Аватар для Рыжий Лис
209 / 164 / 44
Регистрация: 17.05.2012
Сообщений: 611
Записей в блоге: 4
08.09.2012, 10:15     массивы(заполнение и запись в файл) #4
знаю теме уже 2 года
вот мой код (правда на java)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.*;
public class lab1_3
{ public static void stolbec(int a[][], int x, int y, int c)
  { for (int i=0; i<x; i++)
      a[i][y] = c;
  }
  public static void stroka(int a[][], int y, int x, int c)
  { for (int j=0; j<y; j++)
      a[x][j] = c;
  }
  public static void main (String [] args) throws IOException
  { System.out.println("Введите рaзмеры матрицы (int): ");
    //Связь с клавиатурой
    BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(bReader.readLine());
    int m = Integer.parseInt(bReader.readLine());
    int a[][] = new int[n][m];
    int k, r;
    do
    { System.out.println("Элемент Akr (int): ");
      k = Integer.parseInt(bReader.readLine());
      r = Integer.parseInt(bReader.readLine());
      k--; r--;
    } while (n<k || m<r);
 
    for (int c=1; c<n || c<m; c++)
    { if (r-c>=0 && r-c<m) lab1_3.stolbec(a,n,r-c,c); //лево
      if (k-c>=0 && k-c<n) lab1_3.stroka(a,m,k-c,c);  //верх
      if (r+c>=0 && r+c<m) lab1_3.stolbec(a,n,r+c,c); //право
      if (k+c>=0 && k+c<n) lab1_3.stroka(a,m,k+c,c);  //низ
    }
    System.out.println();
    for (int i=0; i<n; i++)
    { for (int j=0; j<m; j++)
        System.out.print(a[i][j] + " ");
      System.out.println();
    }
  }
}
Yandex
Объявления
08.09.2012, 10:15     массивы(заполнение и запись в файл)
Ответ Создать тему
Опции темы

Текущее время: 21:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru