ZOJ 2050 Flip Game

这个题目花了我4个小时……
map,queue都给用上了,发现STL的效率实在是……
逼不得已,这能试试我最不熟悉的位运算了,事实上,位的效率实在是高!编起来也实在是恶心,好歹是AC了( 再不过我都打算手工队列哈希了 )
#include <iostream>
#include <map>
#include <queue>
#include <string>
using namespace std;
inline char Rev(char r)
{
 if(r=='b')
  return 'w';
 else
  return 'b';
}

struct CRer
{
 int str;
 int cnt;
};

int main()
{
 bool xxx = false;
 map<int, char> Rer;
 queue<CRer> Chuan;
 CRer CRT,CRT2;
    int n,i,j,t,god;
 char myr;
 bool fr;
    cin >> n;
    while(n--)
    {  
  if(xxx==false)
   xxx = true;
  else
   cout << endl;
  fr = false;
  cin.get();cin.get();t=0;
  for(i=0;i<4;++i)
  {
   for(j=0;j<4;++j)
   {
    myr = cin.get();
    if(myr=='b')
     t |= 1<<(i*4+j);
    else if(myr=='w')
     t |= 0<<(i*4+j);
   }
   if(i!=3)
    myr = cin.get();
  }
  Rer[t] = 1;
  CRT.str = t;
  CRT.cnt = 0;
  Chuan.push(CRT);
  while(!Chuan.empty())
  {
   CRT = Chuan.front();
   if(CRT.str == 65535||CRT.str == 0)
   {
    fr = true;
    break;    
   }
   Chuan.pop();
   for(i=0;i<4;++i)
    for(j=0;j<4;++j)
    {
     god = i*4+j;
     t = CRT.str;
     if((t&(1<<god))==0)
      t |= (1<<god);
     else
      t &= ~(1<<god);
     if(god-4>=0)
     {
      if((t&(1<<god-4))==0)
       t |= (1<<god-4);
      else
       t &= ~(1<<god-4);
     }
     if(god+4<=15)
     {
      if((t&(1<<god+4))==0)
       t |= (1<<god+4);
      else
       t &= ~(1<<god+4);
     }
     if(god!=0&&god!=4&&god!=8&&god!=12)
     {
      if((t&(1<<god-1))==0)
       t |= (1<<god-1);
      else
       t &= ~(1<<god-1);
     }
     if(god!=3&&god!=7&&god!=11&&god!=15)
     {
      if((t&(1<<god+1))==0)
       t |= (1<<god+1);
      else
       t &= ~(1<<god+1);
     }
     if(Rer.find(t)==Rer.end())
     {
      CRT2.str = t;
      CRT2.cnt = CRT.cnt+1;
      Rer[t] = true;
      Chuan.push(CRT2);
     }
    }
  }
  if(fr==true)
   cout << CRT.cnt << endl;
  else
   cout << "Impossible" << endl;
  while(!Chuan.empty())
   Chuan.pop();
  Rer.clear();
    }
    return 0;
}

posted on 2006-12-07 17:29  AnewR  阅读(326)  评论(0)    收藏  举报