zoukankan      html  css  js  c++  java
  • codevs 2449 骑士精神 (IDDfs)

    /*
    限制步数 写迭代加深 
    注意剪枝:当先步数+不同的个数-1>当前限制的步数 就cut 
    */
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define limit 15
    using namespace std;
    int T,ans=20,falg;
    int xx[9]={0,-2,-2,-1,-1,1,1,2,2};
    int yy[9]={0,-1,1,-2,2,2,-2,1,-1};
    int s[10][7],get[10][10];
    int target[10][10];
    char si;
    void Get_target()
    {
        target[1][1]=1;target[1][2]=1;target[1][3]=1;target[1][4]=1;target[1][5]=1;
        target[2][1]=0;target[2][2]=1;target[2][3]=1;target[2][4]=1;target[2][5]=1;
        target[3][1]=0;target[3][2]=0;target[3][3]=2;target[3][4]=1;target[3][5]=1;
        target[4][1]=0;target[4][2]=0;target[4][3]=0;target[4][4]=0;target[4][5]=1;
        target[5][1]=0;target[5][2]=0;target[5][3]=0;target[5][4]=0;target[5][5]=0;
    }
    int Judge()
    {
        int ret=0;
        for(int i=1;i<=5;i++)
          for(int j=1;j<=5;j++)
            if(s[i][j]!=target[i][j])
              ret++;
        return ret;
    }
    void Dfs(int now,int x,int y,int sum)
    {
        if(falg)return;
        int c=Judge();
        if(now==sum)
          {
              if(c==0)
              ans=sum,falg=1;
            return;
          }
        if(now-1+c>sum)return;
        for(int i=1;i<=8;i++)
          {
              int nx=x+xx[i];
              int ny=y+yy[i];
              if(nx>0&&nx<=5&&ny>0&&ny<=5)
                {
                    swap(s[x][y],s[nx][ny]);
                Dfs(now+1,nx,ny,sum);
                 swap(s[x][y],s[nx][ny]);
              }
          }
    }
    int main()
    {
        scanf("%d",&T);
        Get_target();
        while(T--)
          {
              int x,y;
              for(int i=1;i<=5;i++)
                 for(int j=1;j<=5;j++)
                  {
                    cin>>si;
                    if(si=='*')x=i,y=j,get[i][j]=2;
                    else get[i][j]=si-'0';
                }
              for(int k=0;k<=limit;k++)
                {
                    falg=0;ans=20;
                    for(int i=1;i<=5;i++)
                  for(int j=1;j<=5;j++)
                    s[i][j]=get[i][j];
                    Dfs(0,x,y,k);
                    if(ans==k)break;
              }
            if(ans<=15)printf("%d
    ",ans);
            else printf("-1
    ");
          }
        return 0;
    }
  • 相关阅读:
    box-sizing: border-box的作用
    什么时候用created,什么时候用mounted
    圣杯布局
    关闭浏览器 清除session
    js this
    js 深拷贝
    经常犯的一些小错误
    语法:c++对关于空指针0/NULL/nullptr三者的演变
    常用的函数
    C++一些小技巧
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5679196.html
Copyright © 2011-2022 走看看