zoukankan      html  css  js  c++  java
  • bzoj1085

    题解:

    暴搜+优化

    如果当前有n个位置不符合,那么至少要n-1次才可以

    然后就可以优化了

    代码:

    #include<bits/stdc++.h>
    #define y1 ____y1
    using namespace std;
    int dx[8]={1,-1,1,-1,2,2,-2,-2};
    int dy[8]={2,2,-2,-2,1,-1,1,-1};
    int f[7][7],a[7][7],ans,T,x,y;
    char s[7];
    void dfs(int p,int x,int y)
    {
        int ss=0;
        for (int i=1;i<=5;i++)
         for (int j=1;j<=5;j++)
          if (f[i][j]!=a[i][j])ss++;    
        if (!ss)
         {
             if (p<ans)ans=p;
             return;
         }
        if (p+ss>ans)return;
        for (int i=0;i<8;i++)
         {
             int x1=x+dx[i],y1=y+dy[i];
             if (x1>0&&x1<6&&y1>0&&y1<6)
              {
                  swap(a[x1][y1],a[x][y]);
                  dfs(p+1,x1,y1);
                  swap(a[x1][y1],a[x][y]);
             }
         }
    }
    void init()
    {
        for (int i=1;i<=5;i++)
         for (int j=i;j<=5;j++)f[i][j]=1;
        f[3][3]=-1;f[4][4]=f[5][5]=0; 
    }
    int main()
    {
        scanf("%d",&T);
        init();
        while (T--)
         {
             for (int i=1;i<=5;i++)
              {
                  scanf("%s",s+1);
                  for (int j=1;j<=5;j++)
                   if (s[j]=='*')
                    {
                       x=i;y=j;
                    a[i][j]=-1;    
                  }
                 else a[i][j]=s[j]-'0'; 
             }
            ans=16;
             dfs(0,x,y);
            if (ans==16)puts("-1");
            else printf("%d
    ",ans); 
         }
    }
  • 相关阅读:
    《我与我的父辈》影评
    如何进行时间规划?
    内向者相关
    修己 0815
    loj 3102
    StringSequences
    解方程
    problem B
    uoj424 count
    fft相关的复习
  • 原文地址:https://www.cnblogs.com/xuanyiming/p/8456265.html
Copyright © 2011-2022 走看看