#include <iostream>
#include <algorithm>
using namespace std;
void zdrowie(int tab[], int n, int &x, int &y)
{
int aktX=-1, aktY=n;
int max=0, aktMax=0;
bool hbdyz = false;
for (int k = n - 1; k >= 0; k--)
{
if (tab[k] == 1 || tab[k]==2)
{
aktMax = 0;
aktY = k; //zakres DO kończy się na ZARAŻONYM po prawej
}
else
{
aktX = k; //zakres OD zaczyna się na NIEZARAŻONYM po lewej
aktMax++;
}
if (aktMax > max)
{
if (aktY == 2)
for(int s=aktY-1;s>=0;s--)
if (tab[s] == 1)
{
hbdyz = true;
break;
}
if (hbdyz)
max = aktMax, y = aktY, x = aktX;
}
else if (aktMax == max && aktX == 0)
{
if (aktY == 2)
for (int s = aktY - 1; s >= 0; s--)
if (tab[s] == 1)
{
hbdyz = true;
break;
}
if (hbdyz)
y = aktY, x = aktX;
}
if (y == n && tab[x - 1] == 2)
max = 0;
hbdyz = false;
}
y--; //zakres DO kończy sią na NIEZARAŻONYM po prawej
}
void szczepienie(int tab[], int n, int x, int y)
{
if (x == 0 || tab[x - 1] == 2)
tab[y] = 2;
else if (y == n || tab[y + 1] == 2)
tab[x] = 2;
}
void noc(int tab[], int n)
{
for (int k = 1; k < n - 1; k++)
if (tab[k] == 1)
{
if (tab[k - 1] == 0)
tab[k - 1] = 1;
if (tab[k + 1] == 0)
tab[k + 1] = 1;
}
if (tab[0] == 1 && tab[1] == 0)
tab[1] = 1;
if (n > 1)
if (tab[n - 1] == 1 && tab[n - 2] == 0)
tab[n - 2] = 1;
}
bool koniec(int tab[], int n)
{
for (int k = 1; k < n; k++)
if (tab[k] == 1 && (tab[k - 1] == 0 || tab[k + 1] == 0))
return false;
if (tab[0] == 1 && tab[1] == 0)
return false;
return true;
}
int wynik(int tab[], int n)
{
int wyjscie = 0;
for (int k = 0; k < n; k++)
if (tab[k] == 1)
wyjscie++;
return wyjscie;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie();
cout.tie();
int t, n, x, y;
string panstwo;
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> n >> panstwo;
x = 0, y = n - 1;
int* a = new int[n+1];
for (int k = 0; k < n; k++)
a[k] = panstwo[k] - 48;
a[n] = 2;
while (!koniec(a, n))
{
for (int k = 0; k < n; k++)
cout << a[k];
cout << '\n';
zdrowie(a, n, x, y);
szczepienie(a, n, x, y);
noc(a, n);
}
cout << wynik(a, n) << '\n';
for (int k = 0; k < n; k++)
cout << a[k];
}
}
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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <iostream> #include <algorithm> using namespace std; void zdrowie(int tab[], int n, int &x, int &y) { int aktX=-1, aktY=n; int max=0, aktMax=0; bool hbdyz = false; for (int k = n - 1; k >= 0; k--) { if (tab[k] == 1 || tab[k]==2) { aktMax = 0; aktY = k; //zakres DO kończy się na ZARAŻONYM po prawej } else { aktX = k; //zakres OD zaczyna się na NIEZARAŻONYM po lewej aktMax++; } if (aktMax > max) { if (aktY == 2) for(int s=aktY-1;s>=0;s--) if (tab[s] == 1) { hbdyz = true; break; } if (hbdyz) max = aktMax, y = aktY, x = aktX; } else if (aktMax == max && aktX == 0) { if (aktY == 2) for (int s = aktY - 1; s >= 0; s--) if (tab[s] == 1) { hbdyz = true; break; } if (hbdyz) y = aktY, x = aktX; } if (y == n && tab[x - 1] == 2) max = 0; hbdyz = false; } y--; //zakres DO kończy sią na NIEZARAŻONYM po prawej } void szczepienie(int tab[], int n, int x, int y) { if (x == 0 || tab[x - 1] == 2) tab[y] = 2; else if (y == n || tab[y + 1] == 2) tab[x] = 2; } void noc(int tab[], int n) { for (int k = 1; k < n - 1; k++) if (tab[k] == 1) { if (tab[k - 1] == 0) tab[k - 1] = 1; if (tab[k + 1] == 0) tab[k + 1] = 1; } if (tab[0] == 1 && tab[1] == 0) tab[1] = 1; if (n > 1) if (tab[n - 1] == 1 && tab[n - 2] == 0) tab[n - 2] = 1; } bool koniec(int tab[], int n) { for (int k = 1; k < n; k++) if (tab[k] == 1 && (tab[k - 1] == 0 || tab[k + 1] == 0)) return false; if (tab[0] == 1 && tab[1] == 0) return false; return true; } int wynik(int tab[], int n) { int wyjscie = 0; for (int k = 0; k < n; k++) if (tab[k] == 1) wyjscie++; return wyjscie; } int main() { ios_base::sync_with_stdio(0); cin.tie(); cout.tie(); int t, n, x, y; string panstwo; cin >> t; for (int i = 0; i < t; i++) { cin >> n >> panstwo; x = 0, y = n - 1; int* a = new int[n+1]; for (int k = 0; k < n; k++) a[k] = panstwo[k] - 48; a[n] = 2; while (!koniec(a, n)) { for (int k = 0; k < n; k++) cout << a[k]; cout << '\n'; zdrowie(a, n, x, y); szczepienie(a, n, x, y); noc(a, n); } cout << wynik(a, n) << '\n'; for (int k = 0; k < n; k++) cout << a[k]; } } |
English