m73题解

牧云@^-^@ 提交于 2019-12-01 08:31:04
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define int long long
  4 #define re register
  5 inline int read()
  6 {
  7     int x=0,f=1;char cc=getchar();
  8     while(cc>'9'||cc<'0'){if(cc=='-')f=-1;cc=getchar();}
  9     while(cc>='0'&&cc<='9'){x=(x<<1)+(x<<3)+cc-'0';cc=getchar();}
 10     return x*f;
 11 }
 12 int n,m;
 13 int mp[10][10];
 14 int las[10][10];
 15 bool vis[10][10];
 16 int ans=0;
 17 bool jud=0;
 18 inline bool judge()
 19 {
 20     for(int i=1;i<=n;i++)
 21     {
 22         for(int j=1;j<=n;j++)
 23         {
 24             if(mp[i][j]!=las[i][j])return 0;
 25         }
 26     }
 27     return 1;
 28 }
 29 inline void debug()//记得删!
 30 {
 31     for(int i=1;i<=n;i++)
 32     {
 33         for(int j=1;j<=n;j++)
 34         {
 35             printf("%lld ",mp[i][j]);
 36         }
 37         puts("");
 38     }
 39     puts("");
 40     return ;
 41 }
 42 inline void get(int dir)
 43 {
 44     //0/1/2/3分别代表上下左右!
 45     memset(vis,0,sizeof(vis));
 46     for(int i=1;i<=n;i++)
 47     {
 48         for(int j=1;j<=n;j++)
 49         {
 50             las[i][j]=mp[i][j];
 51         }
 52     }
 53     if(dir==0)
 54     {
 55         for(int i=1;i<=n;i++)
 56         {
 57             for(int j=1;j<=n;j++)
 58             {    
 59                 if(!mp[i][j])continue;
 60                 int cp=i-1;
 61                 while(!mp[cp-1][j]&&cp-1>=1)cp--;
 62                 if(mp[cp][j])cp++;
 63                 cp=max(cp,1ll);
 64                 //printf("up %d %d %d %d\n",i,j,cp,j);
 65                 if(mp[cp-1][j]&&mp[cp-1][j]==mp[i][j]&&!vis[cp-1][j])
 66                 {    
 67                     mp[cp-1][j]*=2;ans+=mp[cp-1][j];vis[cp-1][j]=1;
 68                     mp[cp][j]=mp[i][j]=0;
 69                 }
 70                 else
 71                 {
 72                     int pc=mp[i][j];mp[i][j]=0;mp[cp][j]=pc;
 73                 }
 74                 
 75             }
 76         }
 77     }
 78     else if(dir==1)
 79     {
 80         for(int i=n;i>=1;i--)
 81         {
 82             for(int j=1;j<=n;j++)
 83             {
 84                 if(!mp[i][j])continue;
 85                 int cp=i+1;
 86                 while(!mp[cp+1][j]&&cp+1<=n)cp++;
 87                 if(mp[cp][j])cp--;
 88                 cp=min(cp,n);
 89                 //printf("down %d %d %d %d\n",i,j,cp,j);
 90                 if(mp[cp+1][j]&&mp[cp+1][j]==mp[i][j]&&!vis[cp+1][j])
 91                 {
 92                     //printf("*2maker_it!\n");
 93                     mp[cp+1][j]*=2;ans+=mp[cp+1][j];vis[cp+1][j]=1;
 94                     mp[i][j]=mp[cp][j]=0;
 95                 }
 96                 else
 97                 {
 98                     //printf("putong maker_it\n");
 99                     int pc=mp[i][j];mp[i][j]=0;mp[cp][j]=pc;
100                 }
101             }
102         }
103     }
104     else if(dir==2)
105     {
106         for(int j=1;j<=n;j++)
107         {
108             for(int i=1;i<=n;i++)
109             {
110                 if(!mp[i][j])continue;
111                 int cp=j-1;
112                 while(!mp[i][cp-1]&&cp-1>=1)cp--;
113                 if(mp[i][cp])cp++;
114                 cp=max(cp,1ll);
115                 //printf("left %d %d %d %d \n",i,j,i,cp);
116                 if(mp[i][cp-1]&&mp[i][cp-1]==mp[i][j]&&!vis[i][cp-1])
117                 {
118                     //printf("type1 out!\n");
119                     mp[i][cp-1]*=2;ans+=mp[i][cp-1];vis[i][cp-1]=1;
120                     mp[i][j]=mp[i][cp]=0;
121                 }
122                 else
123                 {
124                     //printf("type2 out!\n");
125                     int pc=mp[i][j];
126                     mp[i][j]=0;mp[i][cp]=pc;
127                 }
128             }
129         }
130     }
131     else if(dir==3)
132     {
133         for(int j=n;j>=1;j--)
134         {
135             for(int i=1;i<=n;i++)
136             {
137                 if(!mp[i][j])continue;
138                 int cp=j+1;
139                 while(!mp[i][cp+1]&&cp+1<=n)cp++;
140                 if(mp[i][cp])cp--;
141                 cp=min(cp,n);
142                 //printf("right %d %d %d %d \n",i,j,i,cp);
143                 if(mp[i][cp+1]&&mp[i][cp+1]==mp[i][j]&&!vis[i][cp+1])
144                 {
145                     mp[i][cp+1]*=2;ans+=mp[i][cp+1];vis[i][cp+1]=1;
146                     mp[i][j]=mp[i][cp]=0;
147                 }
148                 else
149                 {
150                     int pc=mp[i][j];mp[i][j]=0;mp[i][cp]=pc;
151                 }
152             }
153         }
154     }
155     //debug();//
156     return ;
157 }
158 inline void make(int pos,int vall)
159 {
160     int ress=0;
161     for(int i=1;i<=n;i++)
162     {
163         for(int j=1;j<=n;j++)
164         {
165             if(!mp[i][j])ress++;
166         }
167     }
168     int poss=1+pos%ress;
169     //printf("%d %d\n",ress,poss);
170     ress=0;
171     for(int i=1;i<=n;i++)
172     {
173         for(int j=1;j<=n;j++)
174         {
175             if(!mp[i][j])ress++;
176             if(ress==poss)
177             {
178                 mp[i][j]=vall;
179                 //printf("make :  %d %d \n",i,j);
180                 return ;
181             }
182         }
183     }
184     return ;
185 }
186 signed main()
187 {
188     //freopen("game_sample2.in","r",stdin);
189     //freopen("cnm1.in","r",stdin);
190     //freopen("me1.out","w",stdout);
191     int cpp=0;
192     n=read(),m=read();
193     int xx,yy,vv;
194     xx=rand()%n+1,yy=rand()%n+1,vv=2;mp[xx][yy]=vv;
195     xx=rand()%n+1,yy=rand()%n+1,vv=2;mp[xx][yy]=vv;
196     //debug();//
197     //0/1/2/3分别代表上下左右!
198     int dir,pos,val;
199     char s;
200     while(1)
201     {
202         cin>>s;
203         if(s=='w')dir=0;
204         if(s=='s')dir=1;
205         if(s=='a')dir=2;
206         if(s=='d')dir=3;
207         pos=rand()%100,val=2;
208         //printf("%d\n",dir);
209         get(dir);
210         //printf("judement %d\n",judge());
211         if(judge()){puts("YOU HAVE DIED!");break;}
212         cpp++;
213         make(pos,val);
214         debug();
215         printf("%lld\n",ans);
216     }
217     printf("%d\n%d\n",cpp,ans);
218     return 0;
219 }
开源!

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!