六数码



#include<iostream>
#include<stdio.h>
#include<map>
#include<queue>

using namespace std;

map<int,int>m;
queue<int>q;

int ini[6];/*数组(是一维整型按题中要求转化的桥梁(u→v))(这个地方有点可读性的失误,这个数组不仅拿来当初始数组,

                                                                                                      还用来作中间的变量数组,但对程序运行无影响)*/
int in;//数组的整型形式
int answer[100]={0},cnt=0;//存放答案的:值为1则YES,为2则NO

void bfs();//广搜
void init();//初始化
int achange(int);
int bchange(int);
void ini1(int);//一维整型到数组
int ini2();//数组到一维整型
void clear();//清空队列!!!
void output();

int main()

 int temp;
 
 int i;
 while(scanf("%d",&ini[0])!=EOF)//以EOF为结束标志
 {
  in=ini[0];
  for(i=1;i<=5;i++)
  {
   cin>>ini[i];
   in=in*10+ini[i];
  }
  
  init();
  
  bfs();
  
  m.clear();
  clear();
 }
 output();
 return(0);
}

void bfs()
{
 int u,v;
 int i;
 int flag=0;
 
 while(!q.empty())
 {
  u=q.front();
  q.pop();
  for(i=0;i<=1;i++)
  {      
   if(i==0)
   {
    v=achange(u);
   }
   else
   {
    v=bchange(u);
   }
   
   if(v==123456)  //判目标
   {
    answer[cnt]=1;
    cnt++;
    flag=1;
    break;
   }
   
   else   //判价值
   {
    if(m.count(v)==0)
    {
     q.push(v);
     m[v]=1;
    }
   }
  }
  if(flag==1)//退出双重循环
  {
   break;
  }
 }
 
 if(flag==0)
 {
  answer[cnt]==0;
  cnt++;
 }
}

void init()
{
 q.push(in);
 m[in]=1;
}

int achange(int u)
{
 ini1(u);
 int temp1,temp2,temp3,temp4;
 
 temp1=ini[0];
 temp2=ini[1];
 temp3=ini[4];
 temp4=ini[3];
 
 ini[1]=temp1;
 ini[4]=temp2;
 ini[3]=temp3;
 ini[0]=temp4;
 
 int v;
 v=ini2();
 return(v);
}

int bchange(int u)
{
 ini1(u);
 
 int temp1,temp2,temp3,temp4;
 
 temp1=ini[1];
 temp2=ini[2];
 temp3=ini[5];
 temp4=ini[4];
 
 ini[2]=temp1;
 ini[5]=temp2;
 ini[4]=temp3;
 ini[1]=temp4;
 
 int v;
 v=ini2();
 return(v);
}

void ini1(int k)
{
 int i;
 for(i=5;i>=0;i--)
 {
  ini[i]=k%10;
  k=k/10;
 }
}

int ini2()
{
 int k=0;
 
 int i;
 for(i=0;i<=5;i++)
 {
  k=ini[i]+k*10;
 }
 
 return(k);
}

void clear()
{
 while(!q.empty())
 {
  q.pop();
 }
}

void output()
{
 int i;
 for(i=0;i<cnt;i++)
 {
  if(answer[i]==1)
  {
   cout<<"Yes"<<endl;
  }
  else
  {
   cout<<"No"<<endl;
  }
 }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值