记录编号 93553 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]玛雅游戏 最终得分 100
用户昵称 GravatarHouJikan 是否通过 通过
代码语言 C++ 运行时间 0.697 s
提交时间 2014-03-26 21:59:53 内存使用 0.32 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
int k;
struct solutions
{
  int x;
  int y;
  int dire;
};
solutions solution[10];
int sumdepth;
bool solved=false;
void solve(int depth,int (*map)[5]);
void swap(int x,int y,int (*map)[5],int dire);
void bomb(int (*map)[5]);
bool empty(int (*map)[5]);
void print();
//====================================
int main()
{
   int map[7][5];
   freopen("mayan.in","r",stdin);
   freopen("mayan.out","w",stdout);
   memset(map,0,sizeof(map));
   cin>>k;
   for(int a=0;a<5;a++)
     solution[a].x=solution[a].y=-1;
   for(int a=0;a<5;a++)
   {
     int b=0;
     int n;
     while (cin>>n&&n)
     {
       map[b][a]=n;
       b++;
     }
   }   
   solve(0,map);
   print();
   //system("pause");
   return 0;
}
//============================================
void solve(int depth,int (*map)[5])
{
   //map[7]
   //map[6]
   //map[5]
   //map[4]
   //map[3]
   //map[2]
   //map[1]
   //map[0]
   if (solved) 
     return;
   if (depth==k)
     return;
   int newmap[7][5];
   for(int x=0;x<5;x++)
     for(int y=0;y<7;y++)
     {
        if (x==1&&y==2&&depth==0)
        {
          int l=1;
        }
        if (x==2&&y==1&&depth==1)
        {
          int l=1;
        }
        if (map[y][x]==0) break;
        if (solved) return;
        if (map[y][x]==map[y][x+1]&&map[y][x-1]!=0) 
          continue;
        if (x!=4&&map[y][x]!=map[y][x+1])
        {
          solution[depth].x=x;
          solution[depth].y=y;
          solution[depth].dire=1;
          memcpy(newmap,map,sizeof(newmap));
          //newmap[6]
          //newmap[5]
          //newmap[4]
          //newmap[3]
          //newmap[2]
          //newmap[1]
          //newmap[0]
         swap(x,y,newmap,1);
          bomb(newmap);
          if (empty(newmap))
          {
            solved=true;
            sumdepth=depth;
            return;
          }
          solve(depth+1,newmap);
        }
        if (solved)
          return;
        if (x!=0&&map[y][x-1]==0)
        {
          solution[depth].x=x;
          solution[depth].y=y;
          solution[depth].dire=-1;
          memcpy(newmap,map,sizeof(newmap));
          swap(x,y,newmap,-1);
          bomb(newmap);
          if (empty(newmap))
          {
            solved=true;
            sumdepth=depth;
            return;
          }
          solve(depth+1,newmap);
        }
     }
}
//=======================================
void swap(int x,int y,int (*map)[5],int dire)
{
   int temp=map[y][x];
   map[y][x]=map[y][x+dire];
   map[y][x+dire]=temp;
   if (map[y][x]==0)
     for(int ny=y+1;ny<7;ny++)
     {
       if (map[ny][x]==0)
       {
         map[ny-1][x]=0;
         break;
       }
       map[ny-1][x]=map[ny][x];
     }
   int nx=x+dire;
   int ny=y-1;
   while (ny!=-1&&map[ny][nx]==0)
   {
     map[ny][nx]=map[ny+1][nx];
     map[ny+1][nx]=0;
     ny--;
   }
}
//======================================
void bomb(int (*map)[5])
{
   //map[5]
   //map[4]
   //map[3]
   //map[2]
   //map[1]
   //map[0]
   bool del[7][5];
   memset(del,false,sizeof(del));
   bool con=false;
   for(int y=0;y<7;y++)
   {
     for(int x=2;x<5;x++)
       if (map[y][x]!=0&&map[y][x]==map[y][x-1]&&map[y][x-1]==map[y][x-2])
       {
         del[y][x]=del[y][x-1]=del[y][x-2]=true;
         con=true;
       }
   }
   for(int x=0;x<5;x++)
     for(int y=2;y<7;y++)
       if (map[y][x]!=0&&map[y][x]==map[y-1][x]&&map[y][x]==map[y-2][x])
       {
         del[y][x]=del[y-1][x]=del[y-2][x]=true;
         con=true;
       }
   if (!con) 
     return;
   for(int x=0;x<5;x++)
     for(int y=0;y<7;y++)
       if (del[y][x])
         map[y][x]=0;
   for(int x=0;x<5;x++)
     for(int y=6;y>=0;y--)
       if (map[y][x]==0)
       {
         for(int ny=y+1;ny<=6;ny++)
         {
            if (map[ny][x]==0)
            {
              map[ny-1][x]=0;
              break;
            }
            map[ny-1][x]=map[ny][x];
         }
         map[6][x]=0;
       }  
   bomb(map);
}
//====================================
bool empty(int (*map)[5])
{
  for(int x=0;x<5;x++)
    for(int y=0;y<7;y++)
      if (map[y][x]!=0)
        return false;
  return true;
}
//====================================
void print()
{
  if (!solved)
  {
    cout<<"-1";
    return;
  }
  for(int a=0;a<=sumdepth;a++)
     printf("%d %d %d\n",solution[a].x,solution[a].y,solution[a].dire);     
}