[关闭]
@zzzc18 2017-05-21T13:44:42.000000Z 字数 3339 阅读 1349

2017.5.5 小P的2048

TEST


此处输入图片的描述
此处输入图片的描述
此处输入图片的描述
此处输入图片的描述
此处输入图片的描述
此处输入图片的描述


暴力模拟即可
巨难调
PS:加随机数,加点输出优化就可以玩了

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. int MAP[10][10],pre[10][10];
  5. int n,m,ans;
  6. int x1,x2,y1,y2;
  7. int D,K,V;
  8. bool pd=0;
  9. void SWAP(int &x,int &y){
  10. int t=x;
  11. x=y;y=t;
  12. }
  13. void DEBUG(){
  14. int i,j;
  15. printf("MAP:\n");
  16. for(i=1;i<=n;i++){
  17. for(j=1;j<=n;j++){
  18. printf("%d ",MAP[i][j]);
  19. }
  20. printf("\n");
  21. }
  22. printf("PRE:\n");
  23. for(i=1;i<=n;i++){
  24. for(j=1;j<=n;j++){
  25. printf("%d ",pre[i][j]);
  26. }
  27. printf("\n");
  28. }
  29. printf("\n");
  30. }
  31. void PRE(){
  32. int i,j;
  33. for(i=1;i<=n;i++){
  34. for(j=1;j<=n;j++){
  35. pre[i][j]=MAP[i][j];
  36. }
  37. }
  38. }
  39. bool check(){
  40. int i,j;int cnt=0,cnt1=0;
  41. for(i=1;i<=n;i++){
  42. for(j=1;j<=n;j++){
  43. if(pre[i][j]==MAP[i][j])
  44. cnt++;
  45. if(!MAP[i][j])
  46. cnt1++;
  47. }
  48. }
  49. if(cnt==n*n)return false;
  50. return true;
  51. }
  52. bool check1(){
  53. int i,j;int cnt1=0;
  54. for(i=1;i<=n;i++){
  55. for(j=1;j<=n;j++){
  56. if(!MAP[i][j])
  57. cnt1++;
  58. }
  59. }
  60. if(cnt1==0)return false;
  61. else return true;
  62. }
  63. void slide0(int x){
  64. int i;
  65. int tt[10];int tcnt=0;
  66. memset(tt,0,sizeof(tt));
  67. for(i=1;i<=n;i++)
  68. if(MAP[i][x]>0)tt[++tcnt]=MAP[i][x],MAP[i][x]=0;
  69. for(i=1;i<=tcnt;i++)
  70. MAP[i][x]=tt[i];
  71. }
  72. void slide1(int x){
  73. int i;
  74. int tt[10];int tcnt=0;
  75. memset(tt,0,sizeof(tt));
  76. for(i=n;i>=1;i--)
  77. if(MAP[i][x]>0)tt[++tcnt]=MAP[i][x],MAP[i][x]=0;
  78. for(i=1;i<=tcnt;i++)
  79. MAP[n-i+1][x]=tt[i];
  80. }
  81. void slide2(int x){
  82. int i;
  83. int tt[10];int tcnt=0;
  84. memset(tt,0,sizeof(tt));
  85. for(i=1;i<=n;i++)
  86. if(MAP[x][i])tt[++tcnt]=MAP[x][i],MAP[x][i]=0;
  87. for(i=1;i<=tcnt;i++)
  88. MAP[x][i]=tt[i];
  89. }
  90. void slide3(int x){
  91. int i;
  92. int tt[10];int tcnt=0;
  93. memset(tt,0,sizeof(tt));
  94. for(i=n;i>=1;i--)
  95. if(MAP[x][i])tt[++tcnt]=MAP[x][i],MAP[x][i]=0;
  96. for(i=1;i<=tcnt;i++)
  97. MAP[x][n-i+1]=tt[i];
  98. }
  99. int work0(int x){//up
  100. int i;int re=0;
  101. for(i=1;i<=n-1;i++){
  102. int start=i;
  103. int loc=i+1;
  104. while(MAP[i+1][x]==0 && i<=n-1){
  105. i++;
  106. loc=i+1;
  107. }
  108. if(MAP[start][x]==MAP[loc][x] && MAP[start][x] && MAP[loc][x]){
  109. MAP[start][x]+=MAP[loc][x];
  110. re+=MAP[start][x];
  111. MAP[loc][x]=0;
  112. i++;
  113. }
  114. }
  115. slide0(x);
  116. return re;
  117. }
  118. int work1(int x){
  119. int i;int re=0;
  120. for(i=n;i>=2;i--){
  121. int start=i;
  122. int loc=i-1;
  123. while(MAP[i-1][x]==0 && i>=2){
  124. i--;
  125. loc=i-1;
  126. }
  127. if(MAP[start][x]==MAP[loc][x] && MAP[start][x] && MAP[loc][x]){
  128. MAP[start][x]+=MAP[loc][x];
  129. re+=MAP[start][x];
  130. MAP[loc][x]=0;
  131. i--;
  132. }
  133. }
  134. slide1(x);
  135. return re;
  136. }
  137. int work2(int x){//left
  138. int i;int re=0;
  139. for(i=1;i<=n-1;i++){
  140. int start=i;
  141. int loc=i+1;
  142. while(MAP[x][i+1]==0 && i<=n-1){
  143. i++;
  144. loc=i+1;
  145. }
  146. if(MAP[x][start]==MAP[x][loc] && MAP[x][start] && MAP[x][loc]){
  147. MAP[x][start]+=MAP[x][loc];
  148. re+=MAP[x][start];
  149. MAP[x][loc]=0;
  150. }
  151. }
  152. slide2(x);
  153. return re;
  154. }
  155. int work3(int x){
  156. int i;int re=0;
  157. for(i=n;i>=2;i--){
  158. int start=i;
  159. int loc=i-1;
  160. while(MAP[x][i-1]==0 && i>=2){
  161. i--;
  162. loc=i-1;
  163. }
  164. if(MAP[x][start]==MAP[x][loc] && MAP[x][start] && MAP[x][loc]){
  165. MAP[x][start]+=MAP[x][loc];
  166. re+=MAP[x][start];
  167. MAP[x][loc]=0;
  168. }
  169. }
  170. slide3(x);
  171. return re;
  172. }
  173. void move0(){
  174. int i;
  175. for(i=1;i<=n;i++)
  176. ans+=work0(i);
  177. }
  178. void move1(){
  179. int i;
  180. for(i=1;i<=n;i++)
  181. ans+=work1(i);
  182. }
  183. void move2(){
  184. int i;
  185. for(i=1;i<=n;i++)
  186. ans+=work2(i);
  187. }
  188. void move3(){
  189. int i;
  190. for(i=1;i<=n;i++)
  191. ans+=work3(i);
  192. }
  193. bool solve(){//0上 1下 2左 3右
  194. if(D==0)move0();
  195. if(D==1)move1();
  196. if(D==2)move2();
  197. if(D==3)move3();
  198. if(!check())return 1;
  199. int i,j;int cnt=0;
  200. for(i=1;i<=n;i++){
  201. for(j=1;j<=n;j++){
  202. if(!MAP[i][j])
  203. cnt++;
  204. }
  205. }
  206. if(cnt==0){
  207. return 1;
  208. }
  209. K=K%cnt+1;cnt=0;
  210. return 0;
  211. }
  212. void newnum(){
  213. int i,j,cnt=0;
  214. for(i=1;i<=n;i++){
  215. for(j=1;j<=n;j++){
  216. if(!MAP[i][j])
  217. cnt++;
  218. if(cnt==K){
  219. MAP[i][j]=V;
  220. return;
  221. }
  222. }
  223. }
  224. }
  225. int main(){
  226. freopen("game.in","r",stdin);
  227. freopen("game.out","w",stdout);
  228. scanf("%d%d",&n,&m);
  229. int a,b;
  230. scanf("%d%d%d%d%d%d",&x1,&y1,&a,&x2,&y2,&b);
  231. MAP[x1][y1]=a;MAP[x2][y2]=b;
  232. int i;
  233. int tot=0;
  234. PRE();
  235. for(i=1;i<=m;i++){
  236. scanf("%d%d%d",&D,&K,&V);
  237. if(solve())break;
  238. newnum();
  239. PRE();
  240. tot++;
  241. }
  242. printf("%d\n",tot);
  243. printf("%d\n",ans);
  244. return 0;
  245. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注