zoukankan      html  css  js  c++  java
  • bzoj 1085: [SCOI2005]骑士精神

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int b[5][5]={{1,1,1,1,1},
     5              {0,1,1,1,1},
     6              {0,0,2,1,1},
     7              {0,0,0,0,1},
     8              {0,0,0,0,0}};
     9 int xx[8]={1,1,-1,-1,2,2,-2,-2},yy[8]={2,-2,2,-2,1,-1,1,-1};
    10 int a[5][5],T,x,y,kg,K;
    11 bool A(int a[5][5],int k)
    12 {
    13     int sum=0;
    14     for(int i=0;i<5;i++)
    15       for(int j=0;j<5;j++)
    16         if(a[i][j]!=b[i][j])
    17           sum++;
    18     return K>=sum+k;
    19 }
    20 bool pan(int a[5][5])
    21 {
    22     for(int i=0;i<5;i++)
    23       for(int j=0;j<5;j++)
    24         if(a[i][j]!=b[i][j])
    25           return 0;
    26     return 1;
    27 }
    28 void dfs(int k,int a[5][5],int x,int y)
    29 {
    30     if(k==K)
    31       {
    32         if(pan(a))
    33           kg=1;
    34         return;
    35       }
    36     if(kg)
    37       return;
    38     for(int i=0;i<8;i++)
    39       {
    40         int nx=x+xx[i],ny=y+yy[i];
    41         if(nx<0||nx>4||ny<0||ny>4)
    42           continue;
    43         swap(a[nx][ny],a[x][y]);
    44         if(A(a,k))
    45           dfs(k+1,a,nx,ny);
    46         swap(a[nx][ny],a[x][y]);
    47       }
    48     return;
    49 }
    50 char ch[10];
    51 int main()
    52 {
    53     scanf("%d",&T);
    54     for(;T;T--)
    55       {
    56         for(int i=0;i<5;i++)
    57           {
    58             scanf("%s",ch);
    59             for(int j=0;j<5;j++)
    60               if(ch[j]=='*')
    61                 {
    62                     a[i][j]=2;
    63                     x=i;
    64                     y=j;
    65                 }
    66               else a[i][j]=ch[j]-'0';
    67           }
    68         for(K=1;K<=15;K++)
    69           {
    70             dfs(0,a,x,y);
    71             if(kg)
    72               {
    73                 printf("%d
    ",K);
    74                 break;
    75               }
    76           }
    77         if(!kg)
    78           printf("-1
    ");
    79         else
    80           kg=0;
    81       }
    82     return 0;
    83 }

    普通的迭代深搜超时,可以用A*

  • 相关阅读:
    Ubuntu开机自动挂载Windows分区
    Ubuntu 修改hosts
    线程安全
    可重入
    java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet问题
    两数相加
    2017-2018 ACM-ICPC, Central Europe Regional Contest (CERC 17)
    Anniversary party
    k倍区间
    算法训练 素因子去重
  • 原文地址:https://www.cnblogs.com/xydddd/p/5236795.html
Copyright © 2011-2022 走看看