zoukankan      html  css  js  c++  java
  • Codevs 2449 骑士精神 2005年省队选拔赛四川

    2449 骑士精神  2005年省队选拔赛四川
     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : **大师 Master**
    题目描述 Description
         在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。
    给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘:
    为了体现出骑士精神,他们必须以最少的步数完成任务。
    输入描述 Input Description
    第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。
    输出描述 Output Description
    对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。
    样例输入 Sample Input
    2
    10110
    01*11
    10111
    01001
    00000
    01011
    110*1
    01110
    01010
    00100
    样例输出 Sample Output
    7
    -1
    数据范围及提示 Data Size & Hint
    见题面
    分类标签 Tags
    **四川 省队选拔赛 2005年**
    /*
    IDA*.
    计算当前状态和目标状态贡献.
    判断是否继续扩展该状态. 
    */
    #include<iostream>
    #include<cstdio>
    #define MAXN 101
    using namespace std;
    int dx[9]={0,1,1,-1,-1,2,2,-2,-2}; 
    int dy[9]={0,2,-2,2,-2,1,-1,1,-1};
    int   s[6][6]={0,0,0,0,0,0,
                   0,1,1,1,1,1,  
                   0,0,1,1,1,1,  
                   0,0,0,2,1,1,  
                   0,0,0,0,0,1, 
                   0,0,0,0,0,0};
    int g[6][6],tmp[6][6],x1,y1,ans,flag,flag2;
    int read(){
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    bool h(int now,int end){
        int tot=0;
        for(int i=1;i<=5;i++)
          for(int j=1;j<=5;j++){
            if(g[i][j]!=s[i][j])
              tot++;
          }
        if(now+tot>end)
          return false;
        return true;  
    }
    bool jd(){
        for(int i=1;i<=5;i++)
          for(int j=1;j<=5;j++){
            if(s[i][j]!=g[i][j]) return false;
          }
          return true;
    }
    void dfs(int x1,int y1,int t,int max1){
        if(t>max1) return ;
        if(flag2) return;
        if(t==max1){
            if(jd()) flag=1;return ;
        }
        for(int i=1;i<=8;i++){
            int x=x1+dx[i],y=y1+dy[i];
            if(x>=1&&x<=5&&y>=1&&y<=5){
                swap(g[x][y],g[x1][y1]);
                if(h(t,max1))
                dfs(x,y,t+1,max1);
                swap(g[x][y],g[x1][y1]);
            }
        }
    }
    int main()
    {
        int t;
        t=read();char ch;
        while(t--){
            flag2=0;
          for(int i=1;i<=5;i++)
            for(int j=1;j<=5;j++){
                    cin>>ch;
                    if(ch=='1') g[i][j]=1,tmp[i][j]=1;
                    if(ch=='0') g[i][j]=0,tmp[i][j]=0;
                    if(ch=='*') g[i][j]=2,tmp[i][j]=2,x1=i,y1=j;
                }
          for(int k=1;k<=15;k++){
            ans=0;flag=0;
            dfs(x1,y1,0,k);
            for(int i=1;i<=5;i++)
              for(int j=1;j<=5;j++)
                g[i][j]=tmp[i][j];
            if(flag){flag2=1;
                printf("%d
    ",k);break;
              }
          }
          if(!flag2) printf("-1
    ");
        }
        return 0;
    }
  • 相关阅读:
    BlockingQueue(阻塞队列)详解
    异步远程调用线程池队列
    JVM中的五大内存区域划分详解及快速扫盲
    http链接管理器
    influxDB 增加
    ArcGIS的sde数据库连接
    arcgis server注册文件夹
    arcmap编辑oracle数据库
    create database connection
    发布gp服务失败
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070789.html
Copyright © 2011-2022 走看看