嗯,一道有趣的考试题
输入0,1 ,2,3(上,下,左,右)
kk:kk%剩下的空格子就是下一步出现数字的位置;
v:下一步出现的数字(2或4)PS:改成随机数也是可以滴~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,x1,x2,y1,y2,ans,ret,v,d,kk,v1,v2,ans2,pp=-1,t;
int p[10][10];
int b[10][10];
bool pd;
void ss(int ret,int v)
{
int tot=0;
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
if(p[j][k]==0)tot++;
if(tot==ret)
{
p[j][k]=v;
return;
}
}
}
int move0()
{
memset(b,0,sizeof(b));
pd=0;
for(int i=1;i<=n;i++)
{
t=0;
for(int j=1;j<=n;j++)
{
if(p[i][j])
b[++t][j]=p[i][j];
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(p[i][j]!=b[i][j])pd=1;
p[i][j]=b[i][j];
}
return pd;
}
int move1()
{
memset(b,0,sizeof(b));
pd=0;
for(int i=n;i>=1;i--)
{
t=0;
for(int j=1;j<=n;j++)
{
if(p[i][j])
b[++t][j]=p[i][j];
}
}
for(int i=n;i>=1;i--)
for(int j=1;j<=n;j++)
{
if(p[i][j]!=b[i][j])pd=1;
p[i][j]=b[i][j];
}
return pd;
}
int move2()
{
memset(b,0,sizeof(b));
pd=0;
for(int i=1;i<=n;i++)
{
t=0;
for(int j=1;j<=n;j++)
{
if(p[i][j])
b[i][++t]=p[i][j];
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(p[i][j]!=b[i][j])pd=1;
p[i][j]=b[i][j];
}
return pd;
}
int move3()
{
memset(b,0,sizeof(b));
pd=0;
for(int i=1;i<=n;i++)
{
t=0;
for(int j=n;j>=1;j--)
{
if(p[i][j])
b[i][++t]=p[i][j];
}
}
for(int i=1;i<=n;i++)
for(int j=n;j>=1;j--)
{
if(p[i][j]!=b[i][j])pd=1;
p[i][j]=b[i][j];
}
return pd;
}
void add0()
{
int kk=move0();
for(int k=1;k<=n;k++)
for(int j=1;j<=n;j++)
{
if(p[j-1][k]==p[j][k]&&p[j][k]!=0)
{
p[j-1][k]+=p[j][k];
ans+=p[j-1][k];
p[j][k]=0;
kk++;
}
}
if(kk==0)printf("%d\n%d",pp,ans);
move0();
}
void add1()
{
int kk=move1();
for(int k=1;k<=n;k++)
for(int j=n-1;j>=1;j--)
{
if(p[j][k]==p[j+1][k]&&p[j][k]!=0)
{
p[j+1][k]+=p[j][k];
ans+=p[j+1][k];
p[j][k]=0;
kk++;
}
}
if(kk==0)printf("%d\n%d",pp,ans);
move1();
}
void add3()
{
int kk=move3();
for(int j=1;j<=n;j++)
for(int k=n-1;k>=1;k--)
{
if(p[j][k+1]==p[j][k]&&p[j][k]!=0)
{
p[j][k+1]+=p[j][k];
ans+=p[j][k+1];
kk++;
p[j][k]=0;
}
}
if(kk==0)printf("%d\n%d",pp,ans);
move3();
}
void add2()
{
int kk=move2();
for(int j=1;j<=n;j++)
for(int k=2;k<=n;k++)
{
if(p[j][k]==p[j][k-1]&&p[j][k]!=0)
{
p[j][k-1]+=p[j][k];
ans+=p[j][k-1];
p[j][k]=0;
kk++;
}
}
if(kk==0)printf("%d\n%d",pp,ans);
move2();
}
int main()
{
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
scanf("%d%d",&n,&m);
scanf("%d%d%d%d%d%d",&x1,&y1,&v1,&x2,&y2,&v2);
p[x1][y1]=v1;
p[x2][y2]=v2;
for(int i=1;i<=m;i++)
{
pp++;
scanf("%d%d%d",&d,&kk,&v);
ans2=0,ret=0;
if(d==0)
{
add0();
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
if(p[j][k]==0)ret++;
}
if(ret==0)
{
printf("%d\n%d",pp,ans);
return 0;
}
ret=1+kk%ret;
ss(ret,v);
}
if(d==1)
{
add1();
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
if(p[j][k]==0)ret++;
}
if(ret==0)
{
printf("%d\n%d",pp,ans);
return 0;
}
ret=1+kk%ret;
ss(ret,v);
}
if(d==3)
{
add3();
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
if(p[j][k]==0)ret++;
}
if(ret==0)
{
printf("%d\n%d",pp,ans);
return 0;
}
ret=1+kk%ret;
ss(ret,v);
}
if(d==2)
{
add2();
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
if(p[j][k]==0)ret++;
}
if(ret==0)
{
printf("%d\n%d",pp,ans);
return 0;
}
ret=1+kk%ret;
ss(ret,v);
}
for(int u=1;u<=n;u++)
{
for(int h=1;h<=n;h++)
printf("%d ",p[u][h]);
printf("\n");
}
printf("\n");
}
printf("%d\n%d",pp,ans);
return 0;
}