Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <stdio.h> char nu_zn[30], zn_nu[101], linia[2001], tab[2001][2001]; long rzedy, kolumny, podl_rz[2001][31], podl_kol[2001][31]; long ruchy[5000][4], licz_ruchy=0, nr_koloru; int main() { for (int ii=1; ii<=100; ii++) zn_nu[ii]=0; for (int ii=0; ii<=30; ii++) nu_zn[ii]=0; for (int ii=1; ii<=2000; ii++) for (int jj=0; jj<=30; jj++) { podl_rz[ii][jj]=0; podl_kol[ii][jj]=0; } scanf("%ld",&rzedy); scanf("%ld",&kolumny); for (int ii=1; ii<=rzedy; ii++) { scanf("%s",linia); for (int jj=0; jj<kolumny; jj++) { if(zn_nu[linia[jj]] == 0) { //Trzeba doda� ten znak nu_zn[0]++; zn_nu[linia[jj]] = nu_zn[0]; nu_zn[nu_zn[0]] = linia[jj]; } tab[ii][jj+1] = zn_nu[linia[jj]]; podl_rz[ii][ zn_nu[linia[jj]] ]++; podl_kol[jj+1][ zn_nu[linia[jj]] ]++; } } // Teraz licznik r�nych kolor�w dla ka�dej kolumny i wiersza: for (int ii=1; ii<=rzedy; ii++) for (int jj=1; jj<=30; jj++) if(podl_rz[ii][jj]>0) podl_rz[ii][0]++; for (int ii=1; ii<=kolumny; ii++) for(int jj=1;jj<=30; jj++) if(podl_kol[ii][jj]>0) podl_kol[ii][0]++; podl_rz[0][0]=0; for (int ii=1; ii<=rzedy; ii++) podl_rz[0][0] += podl_rz[ii][0]; podl_kol[0][0]=0; for (int ii=1; ii<=kolumny; ii++) podl_kol[0][0] += podl_kol[ii][0]; /* for (int ii=1; ii<=rzedy; ii++) { for (int jj=1; jj<=kolumny; jj++) printf("%d",tab[ii][jj]); printf("\n"); } printf("\nPodliczanie rzedow (wsz=%ld):\n",podl_rz[0][0]); for (int ii=1; ii<=rzedy; ii++) { printf("rzad %d: ",ii); for (int jj=0; jj<=nu_zn[0]; jj++) printf("%ld ", podl_rz[ii][jj]); printf("\n"); } printf("\nPodliczanie kolumn (wsz=%ld):\n",podl_kol[0][0]); for (int ii=1; ii<=kolumny; ii++) { printf("kolumna %d: ",ii); for (int jj=0; jj<=nu_zn[0]; jj++) printf("%ld ", podl_kol[ii][jj]); printf("\n"); } */ while ((podl_rz[0][0]>0)&&(podl_kol[0][0]>0)) { // Na zmian� przegl�dam wszystkie rz�dy oraz kolumny w poszukiwaniu takich, w kt�rych jest tylko jeden kolor. // Je�li taki znajd�, to wykonuj� ten ruch (p�niej wynik zapisz� w odwrotnej kolejno�ci); // Trzeba wyzerowa� tabel� z obrazkiem. Z ka�dym zerowanym elementem zmniejsza� te� podliczenia, aktualizuj�c przy tym sum� podlicze�. for (int rz = 1; rz<= rzedy; rz++) if (podl_rz[rz][0] == 1) { // Wykonuj� ten ruch: licz_ruchy++; ruchy[licz_ruchy][1] = 1; // 1 - rz�d; 2 - kolumna ruchy[licz_ruchy][2] = rz; // numer rz�du for (int ii=1; ii<=30; ii++) if (podl_rz[rz][ii] > 0) { nr_koloru=ii; break; } ruchy[licz_ruchy][3] = nr_koloru; // Kasuj� ten rz�d w podliczeniu podl_rz[rz][0] = 0; podl_rz[0][0]--; // Po kolei id� po tablicy i je�li jest ten element, to odejmuj� z danej kolumny for (int jj=1; jj<=kolumny; jj++) if (tab[rz][jj] > 0) { // Znalaz�em element w tablicy, kt�ry trzeba odj�� podl_kol[jj][tab[rz][jj]]--; if (podl_kol[jj][tab[rz][jj]]==0) { // Wyzerowa�o si�, wi�c trzeba zaktualizowa� podliczenia podl_kol[jj][0]--; podl_kol[0][0]--; } // Wyzerowanie tego elementu: tab[rz][jj] = 0; } } for (int kol=1; kol<=kolumny; kol++) if (podl_kol[kol][0]==1) { //Wykonuj� ruch: licz_ruchy++; ruchy[licz_ruchy][1] = 2; // 1-rz�d; 2-kolumna ruchy[licz_ruchy][2] = kol; // numer kolumny for (int ii=1; ii<=30; ii++) if (podl_kol[kol][ii] >0) { nr_koloru=ii; break; } ruchy[licz_ruchy][3] = nr_koloru; // Kasuj� t� kolumn� w podliczeniu podl_kol[kol][0]=0; podl_kol[0][0]--; // Po kolei id� po tablicy i je�li jest ten element, to odejmuj� z danego wiersza for (int ii=1; ii<=rzedy; ii++) if (tab[ii][kol] > 0) { // Znalaz�em element do odj�cia podl_rz[ii][tab[ii][kol]]--; if (podl_rz[ii][tab[ii][kol]]==0) { // Wyzerowa�o si�, wi�c aktualizuj� podliczenia podl_rz[ii][0]--; podl_rz[0][0]--; } // Wyzerowanie tego elementu w tablicy: tab[ii][kol] = 0; } } } // No i pozosta�o wypisanie wyniku, ale w odwrotnej kolejno�ci: printf("%ld\n",licz_ruchy); for (int ii=licz_ruchy; ii>=1; ii--) { if (ruchy[ii][1]==1) printf("R "); else printf("K "); printf("%ld ",ruchy[ii][2]); printf("%c\n",nu_zn[ruchy[ii][3]]); } return 0; }
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 | #include <stdio.h> char nu_zn[30], zn_nu[101], linia[2001], tab[2001][2001]; long rzedy, kolumny, podl_rz[2001][31], podl_kol[2001][31]; long ruchy[5000][4], licz_ruchy=0, nr_koloru; int main() { for (int ii=1; ii<=100; ii++) zn_nu[ii]=0; for (int ii=0; ii<=30; ii++) nu_zn[ii]=0; for (int ii=1; ii<=2000; ii++) for (int jj=0; jj<=30; jj++) { podl_rz[ii][jj]=0; podl_kol[ii][jj]=0; } scanf("%ld",&rzedy); scanf("%ld",&kolumny); for (int ii=1; ii<=rzedy; ii++) { scanf("%s",linia); for (int jj=0; jj<kolumny; jj++) { if(zn_nu[linia[jj]] == 0) { //Trzeba doda� ten znak nu_zn[0]++; zn_nu[linia[jj]] = nu_zn[0]; nu_zn[nu_zn[0]] = linia[jj]; } tab[ii][jj+1] = zn_nu[linia[jj]]; podl_rz[ii][ zn_nu[linia[jj]] ]++; podl_kol[jj+1][ zn_nu[linia[jj]] ]++; } } // Teraz licznik r�nych kolor�w dla ka�dej kolumny i wiersza: for (int ii=1; ii<=rzedy; ii++) for (int jj=1; jj<=30; jj++) if(podl_rz[ii][jj]>0) podl_rz[ii][0]++; for (int ii=1; ii<=kolumny; ii++) for(int jj=1;jj<=30; jj++) if(podl_kol[ii][jj]>0) podl_kol[ii][0]++; podl_rz[0][0]=0; for (int ii=1; ii<=rzedy; ii++) podl_rz[0][0] += podl_rz[ii][0]; podl_kol[0][0]=0; for (int ii=1; ii<=kolumny; ii++) podl_kol[0][0] += podl_kol[ii][0]; /* for (int ii=1; ii<=rzedy; ii++) { for (int jj=1; jj<=kolumny; jj++) printf("%d",tab[ii][jj]); printf("\n"); } printf("\nPodliczanie rzedow (wsz=%ld):\n",podl_rz[0][0]); for (int ii=1; ii<=rzedy; ii++) { printf("rzad %d: ",ii); for (int jj=0; jj<=nu_zn[0]; jj++) printf("%ld ", podl_rz[ii][jj]); printf("\n"); } printf("\nPodliczanie kolumn (wsz=%ld):\n",podl_kol[0][0]); for (int ii=1; ii<=kolumny; ii++) { printf("kolumna %d: ",ii); for (int jj=0; jj<=nu_zn[0]; jj++) printf("%ld ", podl_kol[ii][jj]); printf("\n"); } */ while ((podl_rz[0][0]>0)&&(podl_kol[0][0]>0)) { // Na zmian� przegl�dam wszystkie rz�dy oraz kolumny w poszukiwaniu takich, w kt�rych jest tylko jeden kolor. // Je�li taki znajd�, to wykonuj� ten ruch (p�niej wynik zapisz� w odwrotnej kolejno�ci); // Trzeba wyzerowa� tabel� z obrazkiem. Z ka�dym zerowanym elementem zmniejsza� te� podliczenia, aktualizuj�c przy tym sum� podlicze�. for (int rz = 1; rz<= rzedy; rz++) if (podl_rz[rz][0] == 1) { // Wykonuj� ten ruch: licz_ruchy++; ruchy[licz_ruchy][1] = 1; // 1 - rz�d; 2 - kolumna ruchy[licz_ruchy][2] = rz; // numer rz�du for (int ii=1; ii<=30; ii++) if (podl_rz[rz][ii] > 0) { nr_koloru=ii; break; } ruchy[licz_ruchy][3] = nr_koloru; // Kasuj� ten rz�d w podliczeniu podl_rz[rz][0] = 0; podl_rz[0][0]--; // Po kolei id� po tablicy i je�li jest ten element, to odejmuj� z danej kolumny for (int jj=1; jj<=kolumny; jj++) if (tab[rz][jj] > 0) { // Znalaz�em element w tablicy, kt�ry trzeba odj�� podl_kol[jj][tab[rz][jj]]--; if (podl_kol[jj][tab[rz][jj]]==0) { // Wyzerowa�o si�, wi�c trzeba zaktualizowa� podliczenia podl_kol[jj][0]--; podl_kol[0][0]--; } // Wyzerowanie tego elementu: tab[rz][jj] = 0; } } for (int kol=1; kol<=kolumny; kol++) if (podl_kol[kol][0]==1) { //Wykonuj� ruch: licz_ruchy++; ruchy[licz_ruchy][1] = 2; // 1-rz�d; 2-kolumna ruchy[licz_ruchy][2] = kol; // numer kolumny for (int ii=1; ii<=30; ii++) if (podl_kol[kol][ii] >0) { nr_koloru=ii; break; } ruchy[licz_ruchy][3] = nr_koloru; // Kasuj� t� kolumn� w podliczeniu podl_kol[kol][0]=0; podl_kol[0][0]--; // Po kolei id� po tablicy i je�li jest ten element, to odejmuj� z danego wiersza for (int ii=1; ii<=rzedy; ii++) if (tab[ii][kol] > 0) { // Znalaz�em element do odj�cia podl_rz[ii][tab[ii][kol]]--; if (podl_rz[ii][tab[ii][kol]]==0) { // Wyzerowa�o si�, wi�c aktualizuj� podliczenia podl_rz[ii][0]--; podl_rz[0][0]--; } // Wyzerowanie tego elementu w tablicy: tab[ii][kol] = 0; } } } // No i pozosta�o wypisanie wyniku, ale w odwrotnej kolejno�ci: printf("%ld\n",licz_ruchy); for (int ii=licz_ruchy; ii>=1; ii--) { if (ruchy[ii][1]==1) printf("R "); else printf("K "); printf("%ld ",ruchy[ii][2]); printf("%c\n",nu_zn[ruchy[ii][3]]); } return 0; } |