usaco 3.2 Magic Squares

题意:给一个二维模版,有3种方式的变化形态,问变化到一个形态的最短路径是什么

直接就用队列找最短即可。

注意保存状态是用map来进行的保存

/*
ID: 
PROG: msquare
LANG: C++
*/
#include<iostream>
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include <map>
#include <set>
#include <math.h>
#include <queue>
#include <algorithm>
#include<vector>
using namespace std;
struct ttt{
int num,p;
};
map<int,ttt>pre;
int q1[10];
int q2[10];
int q3[5];
int qq[50500];
int main(){
    freopen("msquare.in","r",stdin);
    freopen("msquare.out","w",stdout);
    int  i,j,k,l1,f1,f2,f3,f4,t4,t1,t2,m;
   	int T,t;
   	int t3,n;
   	t1=0;
   	for(i=1;i<=4;i++){
        cin >> t2;
        t1=t1*10+t2;
   	}
   	for(i=1;i<=4;i++){
        cin >> q3[i];
   	}
   	for(i=4;i>=1;i--){
        t1=t1*10+q3[i];
   	}
   	queue<int>G;
   	pre[12348765].p=-1;
   	G.push(12348765);
   	int u,v,u1;
   	while(!G.empty()){
        u=G.front();G.pop();
        if(u==t1)break;
        u1=u;
        for(i=8;i>=1;i--){
            q1[i]=q2[i]=u%10;
            u/=10;}
            v=0;
        for(i=5;i<=8;i++)
            v=v*10+q1[i];
        for(i=1;i<=4;i++)
            v=v*10+q1[i];
        if(pre[v].p==0){
            pre[v].p=u1;
            pre[v].num=1;
            G.push(v);
        }
        v=0;
        q2[1]=q1[4];
        for(i=2;i<=4;i++)
            q2[i]=q1[i-1];
        q2[5]=q1[8];
        for(i=6;i<=8;i++)
            q2[i]=q1[i-1];
        v=0;
        for(i=1;i<=8;i++){
            v=v*10+q2[i];
        }
        if(pre[v].p==0){
            pre[v].p=u1;
            pre[v].num=2;
            G.push(v);
        }
        f1=q1[3];
        q1[3]=q1[2];
        q1[2]=q1[6];
        q1[6]=q1[7];
        q1[7]=f1;
        v=0;
        for(i=1;i<=8;i++)
            v=v*10+q1[i];
        if(pre[v].p==0){
            pre[v].p=u1;
            pre[v].num=3;
            G.push(v);
        }
   	}
   	ttt uuu;
   	uuu.p=u;
   	t1=0;
    while(1){
        if(pre[uuu.p].p==-1)break;
        uuu=pre[uuu.p];
        qq[++t1]=uuu.num;
    }
    cout << t1<< endl;
    for(i=t1;i>=1;i--){
      if(qq[i]==1)
        cout <<"A";
      else if(qq[i]==2)
        cout <<"B";
      else
        cout << "C";
    }
    cout << endl;
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值