Задачата е следната. :
Дадена е мрежа от n x m квадратчета, като за всяко квадратче е определен цвят - бял или черен. Път ще наричаме редица от съседни във вертикално или хоризонтално направление квадратчетата с един и същ цвят. Област ще наричаме множество от квадратчета с един и същ цвят между всеки две, от които има път. Дадено е квадратче. Да се определи броят на квадратчетата от областта, в която се съдържа даденото квадратче.
Задачата мислех, че съм я решил, обаче при определени стойности ми дава грешни резултати. Изглежда, че проблемът е във функциите ver и hor, но Не мога да видя какъв е проблемът.
Аз ползвам следната матрица, при координати x = 0, y = 2, очаквайки вертикално да не участва в област, а хоризонтално да участва в област от 3 квадратчета.
0, 0, 0, 0, 1,
1, 1, 0, 0, 1,
0, 1, 0, 1, 0,
0, 1, 1, 1, 1,
0, 0, 0, 0, 1;
Ето кода:
#include <iostream>
#include <iomanip>
using namespace std;
int a[20][20];
int m, n, k;
void readarr(int, int, int a[][20]);
void writearr(int, int, int a[][20]);
int hor(int, int);
int ver(int, int);
int main()
{
int x, y;
cout << "Rows: ";
cin >> n;
cout << "Columns: ";
cin >> m;
cout << endl;
cout << "Enter coordinates X & Y." << endl;
cout << "X = ";
cin >> x;
cout << "Y = ";
cin >> y;
readarr (n, m, a);
k = a[x][y];
writearr (n, m, a);
if (a[x][y+1] != k && a[x][y-1] != k)
cout << "Kvadrat4eto s poso4enite koordinati u4astva horizontalno v oblast s 1 kvadrat4e" << endl;
else if (a[x][y+1] != k || a[x][y-1] != k)
cout << "Kvadrat4eto s poso4enite koordinati ne obrazuva oblast horizontalno." << endl;
else if (hor(x, y) == m)
cout << "Kvadrat4eto s poso4enite koordinati u4astva horizontalno v oblast s " << m - 2 << " kvadrat4eta." << endl;
else
cout << "Kvadrat4eto s poso4enite koordinati u4astva horizontalno v oblast s " << hor (x, y) << " kvadrat4eta." << endl;
a[x][y] = k;
if (a[x-1][y] != k && a[x+1][y] != k)
cout << "Kvadrat4eto s poso4enite koordinati u4astva vertikalno v oblast ot 1 kvadrat4e" << endl;
else if (a[x-1][y] != k || a[x+1][y] != k)
cout << "Kvadrat4eto s poso4enite koordinati ne obrazuva oblast vertikalno." << endl;
else if (ver(x, y) == n)
cout << "Kvadrat4eto s poso4enite koordinati u4astva vertikalno v oblast s " << n - 2 << " kvadrat4eta." << endl;
else cout << "Kvadrat4eto s poso4enite koordinati u4astva vertikalno v oblast s " << ver (x, y) << " kvadrat4eta." << endl;
system ("pause");
return 0;
}
void readarr(int n, int m, int a[][20])
{
cout << "Vuvedete mrejata, kato '0' e bqlo, a '1' e 4erno kvadrat4e: " << endl;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
cout << "a[" << i << "][" << j << "]=";
cin >> a[i][j];
}
}
void writearr(int n, int m, int a[][20])
{
cout << "MREJA: " << endl;
for (int i = 0; i < n; i++)
{for (int j = 0; j < m; j++) cout << setw(5) << a[i][j];
cout << endl;
}
}
int hor(int x, int y)
{
if (x < 0 || x > n - 1 || y < 0 || y > m - 1) return 0;
if (a[x][y] != k) return 0;
a[x][y] = -1;
return 1 + hor(x, y - 1) + hor(x, y + 1);
}
int ver(int x, int y)
{
if (x < 0 || x > n - 1 || y < 0 || y > m - 1) return 0;
if (a[x][y] != k) return 0;
a[x][y] = -1;
return 1 + ver(x - 1, y) + ver(x + 1, y);
}
ver намира области във вертикално направление, hor в хоризонтално.
Някакви идеи? И на съвсем нов код пак ще съм доволен, макар че се съмнявам на някой да ми се занимава.