Advertisement
Dorijanko

minesweeper interactor

Feb 2nd, 2019
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. #include "testlib.h"
  2. #include <bits/stdc++.h>
  3.  
  4. using namespace std;
  5.  
  6. string h[101],h1[101];
  7. bool bio[101][101];
  8. int n,m,k,r,s,se;
  9.  
  10. int dx[]={1,0,-1,0,1,1,-1,-1};
  11. int dy[]={0,1,0,-1,-1,1,1,-1};
  12.  
  13. bool ok(int i,int j)
  14. {
  15. return (i>=0 && j>=0 && i<n && j<m);
  16. }
  17.  
  18. int countKnown()
  19. {
  20. int a=0;
  21. for (int i=0;i<n;++i) for (int j=0;j<m;++j) if (h1[i][j]!='?') ++a;
  22. return a;
  23. }
  24.  
  25. void dfs(int i,int j)
  26. {
  27. if (!ok(i,j)) return;
  28. if (bio[i][j]) return;
  29. if (h[i][j]=='*') return;
  30. bio[i][j]=1;
  31. h1[i][j]=h[i][j];
  32. if (h[i][j]!='0') return;
  33. for (int k=0;k<8;++k) dfs(i+dx[k],j+dy[k]);
  34. }
  35.  
  36. bool close(int i,int j)
  37. {
  38. if (i==r && j==s) return 1;
  39. for (int k=0;k<8;++k) if ((i+dx[k])==r && (j+dy[k])==s) return 1;
  40. return 0;
  41. }
  42.  
  43. int minCount()
  44. {
  45. int mo=0;
  46. for (int i=0;i<n;++i) for (int j=0;j<m;++j) if (h[i][j]=='*') ++mo;
  47. return mo;
  48. }
  49.  
  50. int main(int argc, char **argv){
  51. registerInteraction(argc, argv);
  52. n = inf.readInt(5, 40);
  53. m = inf.readInt(5, 40);
  54. k = inf.readInt(1, n*m/4);
  55. se = inf.readInt();
  56. registerGen(argc,argv,1);
  57. cout<<n<<' '<<m<<' '<<k<<endl;
  58. r = ouf.readInt(0,n-1);
  59. s = ouf.readInt(0,m-1);
  60. double lo=0.0001,hi=10000;
  61. bool found=0;
  62. for (int i=0;i<n;++i) for (int j=0;j<m;++j) h[i].push_back('.');
  63. while (!found)
  64. {
  65. double mid=(lo+hi)/2,c=clock();
  66. int su=0,ti=0;
  67. do
  68. {
  69. for (int i=0;i<n;++i) for (int j=0;j<m;++j)
  70. {
  71. if (close(i,j)) continue;
  72. if (rnd.next(1010101)%(int(n*m/sqrt(1+sqrt((i-r)*(i-r)+(j-s)*(j-s)))))<k*mid) h[i][j]='*';
  73. else h[i][j]='.';
  74. }
  75. su+=minCount();
  76. ++ti;
  77. }
  78. while (minCount()!=k && (clock()-c)/CLOCKS_PER_SEC<0.01);
  79. if (minCount()==k) found=1;
  80. if (su*1./ti<k) lo=mid;
  81. else hi=mid;
  82. }
  83. for (int i=0;i<n;++i) for (int j=0;j<m;++j)
  84. {
  85. if (h[i][j]=='*') continue;
  86. int a=0;
  87. for (int k=0;k<8;++k)
  88. {
  89. int i2=i+dx[k],j2=j+dy[k];
  90. if (!ok(i2,j2)) continue;
  91. if (h[i2][j2]=='*') ++a;
  92. }
  93. h[i][j]=a+'0';
  94. }
  95. for (int i=0;i<n;++i) for (int j=0;j<m;++j) h1[i].push_back('?');
  96. dfs(r,s);
  97. bool done=0;
  98. while (!done && countKnown()!=n*m)
  99. {
  100. for (int i=0;i<n;++i) cout<<h1[i]<<endl;
  101. int z=ouf.readInt(0,n*m);
  102. if (z==0)
  103. {
  104. tout<<"Z=0"<<endl;
  105. break;
  106. }
  107. for (int i=0;i<z;++i)
  108. {
  109. int q=ouf.readInt(0,n-1);
  110. int w=ouf.readInt(0,m-1);
  111. ouf.readSpace();
  112. char th=ouf.readChar();
  113. if (th=='*')
  114. {
  115. if (h[q][w]!='*')
  116. {
  117. if (!done) tout<<"Thought it was a mine, but it's nothing."<<endl;
  118. done=1;
  119. }
  120. else
  121. {
  122. h1[q][w]=h[q][w];
  123. dfs(q,w);
  124. }
  125. }
  126. else
  127. {
  128. if (h[q][w]=='*')
  129. {
  130. if (!done) tout<<"Thought it was nothing, but it was a mine."<<endl;
  131. done=1;
  132. }
  133. else
  134. {
  135. h1[q][w]=h[q][w];
  136. dfs(q,w);
  137. }
  138. }
  139. }
  140. }
  141. if (countKnown()==n*m)
  142. {
  143. tout<<"Correctly identified everything on the map."<<endl;
  144. for (int i=0;i<n;++i) cout<<h1[i]<<endl;
  145. }
  146. else
  147. {
  148. cout<<"Wrong"<<endl;
  149. }
  150. tout<<(countKnown()*countKnown()*1.)/(n*m*sqrt(n*m))<<endl<<countKnown()<<endl;
  151. quitf(_ok, "%d known things", countKnown());
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement