USACO Section 1.4 clocks - 好恶心的搜索题

    或许是我的处理问题...这题代码给敲了这么多...就是一个裸的BFS+Hash判重...判重就是把矩阵看成一个9位的四进制数...

    开始我还想写A*...自以为是的用每个点的值到12的差之和来构造g(x)....结果就是搜不对..后来仔细一想...这题的g函数反正我是一下想不出....直接用BFS给水了..速度不太给力的说...应该能用A*的感觉~~

Program:

/*  
ID: zzyzzy12  
LANG: C++  
TASK: clocks 
*/    
#include<iostream>    
#include<stdio.h>    
#include<string.h>    
#include<math.h>    
#include<algorithm>    
#include<queue>
using namespace std;
struct node  
{  
     int s[3][3],way[50],num;   
}h,k;   
queue<node> myqueue;    
int change(int x)
{
     if (x==12) return 3;
     if (x==3) return 6;
     if (x==6) return 9;
     return 12;   
}
int had(node h)
{
     int i,j,ans=0,k=1;
     for (i=0;i<3;i++)
       for (j=0;j<3;j++)
       {
            ans+=(k*h.s[i][j]/3);
            k*=4;    
       }  
     return ans; 
} 
bool f[3000000];
void pushit(node h,int p)
{
     node k=h;
     int temp;
     k.num=h.num+1;
     k.way[k.num]=p;  
     if (p==1)
     {   
         k.s[0][0]=change(k.s[0][0]);
         k.s[0][1]=change(k.s[0][1]);
         k.s[1][0]=change(k.s[1][0]);
         k.s[1][1]=change(k.s[1][1]); 
     }else
     if (p==2)
     {
         k.s[0][0]=change(k.s[0][0]);
         k.s[0][1]=change(k.s[0][1]);
         k.s[0][2]=change(k.s[0][2]);     
     }else
     if (p==3)
     {
         k.s[0][1]=change(k.s[0][1]);
         k.s[0][2]=change(k.s[0][2]);
         k.s[1][1]=change(k.s[1][1]);    
         k.s[1][2]=change(k.s[1][2]);        
     }else
     if (p==4)
     {
         k.s[0][0]=change(k.s[0][0]);
         k.s[1][0]=change(k.s[1][0]);
         k.s[2][0]=change(k.s[2][0]);   
     }else
     if (p==5)
     {
         k.s[0][1]=change(k.s[0][1]);
         k.s[1][0]=change(k.s[1][0]);
         k.s[1][1]=change(k.s[1][1]);  
         k.s[1][2]=change(k.s[1][2]);
         k.s[2][1]=change(k.s[2][1]);  
     }else
     if (p==6)
     {
         k.s[0][2]=change(k.s[0][2]);
         k.s[1][2]=change(k.s[1][2]);
         k.s[2][2]=change(k.s[2][2]);  
     }else
     if (p==7)
     {
         k.s[1][0]=change(k.s[1][0]);
         k.s[1][1]=change(k.s[1][1]);
         k.s[2][0]=change(k.s[2][0]);  
         k.s[2][1]=change(k.s[2][1]); 
     }else
     if (p==8)
     {
         k.s[2][0]=change(k.s[2][0]);
         k.s[2][1]=change(k.s[2][1]);
         k.s[2][2]=change(k.s[2][2]);    
     }else
     if (p==9)
     {
         k.s[1][1]=change(k.s[1][1]);
         k.s[1][2]=change(k.s[1][2]);
         k.s[2][1]=change(k.s[2][1]);  
         k.s[2][2]=change(k.s[2][2]); 
     }
     temp=had(k);
     if (!f[temp])
     {
         f[temp]=true;         
         myqueue.push(k);
     }  
}
bool ok(node h)
{
     int i,j;
     for (i=0;i<3;i++) 
       for (j=0;j<3;j++)
          if (h.s[i][j]!=12) return false;
     return true;
}
int main()
{
     freopen("clocks.in","r",stdin);
     freopen("clocks.out","w",stdout);
     for (int i=0;i<3;i++)
        for (int j=0;j<3;j++)
           scanf("%d",&h.s[i][j]);
     h.num=0;
     while (!myqueue.empty()) myqueue.pop();
     myqueue.push(h); 
     memset(f,false,sizeof(f));
     while (!myqueue.empty())
     {
          h=myqueue.front();
          myqueue.pop();
          if (ok(h)) break;
          for (int i=1;i<=9;i++) pushit(h,i); 
     }   
     printf("%d",h.way[1]);
     for (int i=2;i<=h.num;i++) printf(" %d",h.way[i]);
     printf("\n");  
     return 0;   
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值