@zzzc18
2017-05-21T13:44:42.000000Z
字数 3339
阅读 1349
TEST
暴力模拟即可
巨难调
PS:加随机数,加点输出优化就可以玩了
#include<cstdio>
#include<cstring>
using namespace std;
int MAP[10][10],pre[10][10];
int n,m,ans;
int x1,x2,y1,y2;
int D,K,V;
bool pd=0;
void SWAP(int &x,int &y){
int t=x;
x=y;y=t;
}
void DEBUG(){
int i,j;
printf("MAP:\n");
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%d ",MAP[i][j]);
}
printf("\n");
}
printf("PRE:\n");
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%d ",pre[i][j]);
}
printf("\n");
}
printf("\n");
}
void PRE(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
pre[i][j]=MAP[i][j];
}
}
}
bool check(){
int i,j;int cnt=0,cnt1=0;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(pre[i][j]==MAP[i][j])
cnt++;
if(!MAP[i][j])
cnt1++;
}
}
if(cnt==n*n)return false;
return true;
}
bool check1(){
int i,j;int cnt1=0;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(!MAP[i][j])
cnt1++;
}
}
if(cnt1==0)return false;
else return true;
}
void slide0(int x){
int i;
int tt[10];int tcnt=0;
memset(tt,0,sizeof(tt));
for(i=1;i<=n;i++)
if(MAP[i][x]>0)tt[++tcnt]=MAP[i][x],MAP[i][x]=0;
for(i=1;i<=tcnt;i++)
MAP[i][x]=tt[i];
}
void slide1(int x){
int i;
int tt[10];int tcnt=0;
memset(tt,0,sizeof(tt));
for(i=n;i>=1;i--)
if(MAP[i][x]>0)tt[++tcnt]=MAP[i][x],MAP[i][x]=0;
for(i=1;i<=tcnt;i++)
MAP[n-i+1][x]=tt[i];
}
void slide2(int x){
int i;
int tt[10];int tcnt=0;
memset(tt,0,sizeof(tt));
for(i=1;i<=n;i++)
if(MAP[x][i])tt[++tcnt]=MAP[x][i],MAP[x][i]=0;
for(i=1;i<=tcnt;i++)
MAP[x][i]=tt[i];
}
void slide3(int x){
int i;
int tt[10];int tcnt=0;
memset(tt,0,sizeof(tt));
for(i=n;i>=1;i--)
if(MAP[x][i])tt[++tcnt]=MAP[x][i],MAP[x][i]=0;
for(i=1;i<=tcnt;i++)
MAP[x][n-i+1]=tt[i];
}
int work0(int x){//up
int i;int re=0;
for(i=1;i<=n-1;i++){
int start=i;
int loc=i+1;
while(MAP[i+1][x]==0 && i<=n-1){
i++;
loc=i+1;
}
if(MAP[start][x]==MAP[loc][x] && MAP[start][x] && MAP[loc][x]){
MAP[start][x]+=MAP[loc][x];
re+=MAP[start][x];
MAP[loc][x]=0;
i++;
}
}
slide0(x);
return re;
}
int work1(int x){
int i;int re=0;
for(i=n;i>=2;i--){
int start=i;
int loc=i-1;
while(MAP[i-1][x]==0 && i>=2){
i--;
loc=i-1;
}
if(MAP[start][x]==MAP[loc][x] && MAP[start][x] && MAP[loc][x]){
MAP[start][x]+=MAP[loc][x];
re+=MAP[start][x];
MAP[loc][x]=0;
i--;
}
}
slide1(x);
return re;
}
int work2(int x){//left
int i;int re=0;
for(i=1;i<=n-1;i++){
int start=i;
int loc=i+1;
while(MAP[x][i+1]==0 && i<=n-1){
i++;
loc=i+1;
}
if(MAP[x][start]==MAP[x][loc] && MAP[x][start] && MAP[x][loc]){
MAP[x][start]+=MAP[x][loc];
re+=MAP[x][start];
MAP[x][loc]=0;
}
}
slide2(x);
return re;
}
int work3(int x){
int i;int re=0;
for(i=n;i>=2;i--){
int start=i;
int loc=i-1;
while(MAP[x][i-1]==0 && i>=2){
i--;
loc=i-1;
}
if(MAP[x][start]==MAP[x][loc] && MAP[x][start] && MAP[x][loc]){
MAP[x][start]+=MAP[x][loc];
re+=MAP[x][start];
MAP[x][loc]=0;
}
}
slide3(x);
return re;
}
void move0(){
int i;
for(i=1;i<=n;i++)
ans+=work0(i);
}
void move1(){
int i;
for(i=1;i<=n;i++)
ans+=work1(i);
}
void move2(){
int i;
for(i=1;i<=n;i++)
ans+=work2(i);
}
void move3(){
int i;
for(i=1;i<=n;i++)
ans+=work3(i);
}
bool solve(){//0上 1下 2左 3右
if(D==0)move0();
if(D==1)move1();
if(D==2)move2();
if(D==3)move3();
if(!check())return 1;
int i,j;int cnt=0;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(!MAP[i][j])
cnt++;
}
}
if(cnt==0){
return 1;
}
K=K%cnt+1;cnt=0;
return 0;
}
void newnum(){
int i,j,cnt=0;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(!MAP[i][j])
cnt++;
if(cnt==K){
MAP[i][j]=V;
return;
}
}
}
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d%d",&n,&m);
int a,b;
scanf("%d%d%d%d%d%d",&x1,&y1,&a,&x2,&y2,&b);
MAP[x1][y1]=a;MAP[x2][y2]=b;
int i;
int tot=0;
PRE();
for(i=1;i<=m;i++){
scanf("%d%d%d",&D,&K,&V);
if(solve())break;
newnum();
PRE();
tot++;
}
printf("%d\n",tot);
printf("%d\n",ans);
return 0;
}