zoukankan      html  css  js  c++  java
  • 六数码

    时限:1000ms 内存限制:10000K  总时限:3000ms

    描述
    现有一两行三列的表格如下:

    A B C
    D E F

    把1、2、3、4、5、6六个数字分别填入A、B、C、D、E、F格子中,每个格子一个数字且各不相同。每种不同的填法称为一种布局。如下:

    1 3 5
    2 4 6
    布局1

    2 5 6
    4 3 1
    布局2

    定义α变换如下:把A格中的数字放入B格,把B格中的数字放入E格,把E格中的数字放入D格,把D格中的数字放入A格。
    定义β变换如下:把B格中的数字放入C格,把C格中的数字放入F格,把F格中的数字放入E格,把E格中的数字放入B格。

    问:对于给定的布局,可否通过有限次的α变换和β变换变成下面的目标布局:

    1 2 3
    4 5 6
    目标布局

     
    输入
    本题有多个测例,每行一个,以EOF为输入结束标志。每个测例的输入是1到6这六个数字的一个排列,空格隔开,表示初始布局ABCDEF格中依次填入的数字。
     
    输出
    每个输出占一行。可以转换的,打印Yes;不可以转换的,打印No。
     
    输入样例
    1 3 5 2 4 6
    2 5 6 4 3 1
     
    输出样例
    No
    Yes
     
    提示
    第二个示例即布局2的一种转换方法:αααβαα
    #include<stdio.h>
    #define deep 15//深搜深度--共判断2^15种状态
    int Arr[deep]={0};
    int num[10]={0};//六个格子填的数
    int flag=0;//标记是否到达终点
    
    void search(int m);
    void Achange();
    void Bchange();
    void check();
    int isaim();
    ////////////////////////////////////////////////////
    int main()
    {
        while(scanf("%d",&num[0])!=EOF)
        {    
            flag=0;
            for(int i=0;i<deep;i++)
                Arr[i]=0;//初始化状态选择数组
    
            for(i=1;i<6;i++)
                scanf("%d",&num[i]);        
            search(0);    
            if(flag==1)    printf("Yes
    ");
            else    printf("No
    ");
        }
        return 0;
    }
    void search(int m)//0,1,2.....15
    {
        if(m==deep)//到达搜索深度
        {  
            check();
            if(flag==1)   
                   return;//若能变换到目标布局,则标记并返回,不再继续搜索
        }
        else
        {    Arr[m]=1;//当前层进行A变换
            search(m+1);
                    Arr[m]=0;//当前层进行B变换
                search(m+1);        
        }
    }
    void check()//检查是否能到达目标
    {
        for(int i=0;i<deep;i++)
        {
            if(Arr[i]==1)
            {
                Achange();
                            if(isaim())
                {  flag=1;  return; }
            }
            else
            {
                Bchange();
                if(isaim())
                {  flag=1;  return; }
            }
        }    
    }
    void Achange()
    {
        int temp=num[0];
        num[0]=num[3];
        num[3]=num[4];
        num[4]=num[1];
        num[1]=temp;
    }
    void Bchange()
    {
        int temp=num[1];
        num[1]=num[4];
        num[4]=num[5];
        num[5]=num[2];
        num[2]=temp;
    }
    int isaim()//判断是否变换到目标布局
    {
        for(int i=0;i<6;i++)
        {
            if(num[i]!=i+1)
               return 0;
        }
        if(i==6) return 1;        
    }
    

     

    态度决定高度,细节决定成败,
  • 相关阅读:
    jQuery(七) jQuery $(document).ready()和javaScript onload事件
    jQuery(六) jQuery修改class属性和CSS样式
    jQuery(五) jQuery操纵DOM元素属性 attr()和removeAtrr()方法使用详解
    jQuery(四) jQuery操作DOM元素
    jQuery(三) jQuery选择器
    jquery(二) jQuery选取和操作元素的特点
    jquery(一) DOM对象与jQuery对象的转换与区别
    fastclick插件使用 移动端点击延时问题
    移动端click事件300毫秒延时解决
    返回顶部
  • 原文地址:https://www.cnblogs.com/lxk2010012997/p/4439794.html
Copyright © 2011-2022 走看看