a53

virus

a53
May 3rd, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstring>
  3. #define DMAX 102
  4.  
  5. using namespace std;
  6. ifstream fin("virus.in");
  7. ofstream fout("virus.out");
  8. char ceroare[]= {1,3,7,15,31,63,127,0};
  9. int n, m, cerinta, nr;
  10. char a[DMAX][DMAX];
  11. int biti[DMAX][DMAX];
  12.  
  13. void citire();
  14. int transforma();
  15. bool gata();
  16. int numara(char x);
  17. char schimba (char x);
  18. char schimbamaxim (char x);
  19.  
  20. int main()
  21. {
  22. citire();
  23. if (cerinta==1)
  24. fout<<transforma()<<'\n';
  25. else
  26. {
  27. while (!gata())
  28. {
  29. transforma();
  30. nr++;
  31. }
  32. fout<<nr<<'\n';
  33. }
  34. return 0;
  35. }
  36.  
  37. void citire()
  38. {
  39. int i, j;
  40. fin>>n>>m;
  41. fin.get();
  42. for (i=1; i<=n; i++)
  43. {
  44. for (j=1; j<=m; j++)
  45. {
  46. fin.get(a[i][j]);
  47. if (strchr(ceroare,a[i][j]))
  48. a[i][j]=0;
  49. }
  50. fin.get();
  51. }
  52. fin>>cerinta;
  53. }
  54.  
  55. bool gata()
  56. {
  57. int i, j;
  58. for (i=1; i<=n; i++)
  59. for (j=1; j<=m; j++)
  60. if (a[i][j])
  61. return 0;
  62. return 1;
  63. }
  64.  
  65. int transforma()
  66. //returneaza numarul de caractere inatacabile obtinute
  67. {
  68. int i, j, maxim=-1, rez=0;
  69. for (i=1; i<=n; i++)
  70. for (j=1; j<=m; j++)
  71. {
  72. biti[i][j]=numara(a[i][j]);
  73. if (biti[i][j]>maxim)
  74. maxim=biti[i][j];
  75. }
  76. for (i=1; i<=n; i++)
  77. for (j=1; j<=m; j++)
  78. if (biti[i][j])
  79. {
  80. if (biti[i][j]==maxim)
  81. a[i][j]=schimbamaxim(a[i][j]);
  82. else
  83. a[i][j]=schimba(a[i][j]);
  84. if (strchr(ceroare,a[i][j]))
  85. a[i][j]=0;
  86. if (a[i][j]==0)
  87. rez++;
  88. }
  89. return rez;
  90. }
  91.  
  92. int numara(char x)
  93. {
  94. int i, rez=0;
  95. for (i=0; i<8; i++)
  96. {
  97. rez+=x%2;
  98. x/=2;
  99. }
  100. return rez;
  101. }
  102.  
  103. char schimba (char x)
  104. {
  105. int v[8], i, rez=0;
  106. for (i=0; i<8; i++)
  107. {
  108. v[i]=x%2;
  109. x/=2;
  110. }
  111. for (i=0; v[i]; i++);
  112. v[i]=1;
  113. for (i=7; i>=0; i--)
  114. rez=rez*2+v[i];
  115. return rez;
  116. }
  117.  
  118. char schimbamaxim (char x)
  119. {
  120. int v[8], i, rez=0, cati;
  121. for (i=0; i<8; i++)
  122. {
  123. v[i]=x%2;
  124. x/=2;
  125. }
  126. for (i=7, cati=0; i>=0 && cati<2; i--)
  127. if (v[i])
  128. {
  129. v[i]=0;
  130. cati++;
  131. }
  132. for (i=7; i>=0; i--)
  133. rez=rez*2+v[i];
  134. return rez;
  135. }
Add Comment
Please, Sign In to add comment