zoukankan      html  css  js  c++  java
  • BZOJ SCOI2005骑士精神

    裸IDA*,ans从1到15循环来限制搜索深度。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 int d,s[6][6],ans;
     6 char c;
     7 bool flag;
     8 int ma[6][6]={{0,0,0,0,0,0},
     9               {0,1,1,1,1,1},
    10               {0,0,1,1,1,1},
    11               {0,0,0,2,1,1},
    12               {0,0,0,0,0,1},
    13               {0,0,0,0,0,0}},dx[8]={1,2,2,1,-1,-2,-2,-1},dy[8]={2,1,-1,-2,-2,-1,1,2};
    14 void swap(int &a,int &b){int c=a;a=b;b=c;}
    15 bool check()
    16 {
    17     int i,j;
    18     for (i=1;i<=5;++i)for (j=1;j<=5;++j)if (s[i][j]!=ma[i][j]) return 0;
    19     return 1;
    20 }
    21 bool f(int g)
    22 {
    23     int h=0,i,j;
    24     for (i=1;i<=5;++i)for (j=1;j<=5;++j)if (s[i][j]!=ma[i][j])
    25     {h++; if (g+h>ans) return 0;}
    26     return 1;
    27 }
    28 void dfs(int x,int y,int g)
    29 {
    30     if (g==ans)
    31     {
    32         if (check()) flag=1;
    33         return;
    34     }
    35     if (flag) return;
    36     int i,nowx,nowy;
    37     for (i=0;i<8;++i)
    38     {
    39         nowx=x+dx[i];nowy=y+dy[i];
    40         if ((nowx<1)||(nowy<1)||(nowx>5)||(nowy>5)) continue;
    41         swap(s[x][y],s[nowx][nowy]);
    42         if (f(g)) dfs (nowx,nowy,g+1);
    43         swap(s[nowx][nowy],s[x][y]);
    44     }
    45 }
    46 int main()
    47 {
    48     int i,j,t,x,y;
    49     scanf("%d
    ",&t);
    50     while (t>0){t--;
    51         for (i=1;i<=5;++i)
    52         {
    53             for (j=1;j<=5;++j)
    54             {
    55                 c=getchar();
    56                 if (c=='*') s[i][j]=2,x=i,y=j;
    57                 else s[i][j]=int(c-'0');                
    58             }
    59             scanf("
    ");
    60         } flag=0;
    61         for (ans=1;ans<=15;++ans)
    62         {
    63             dfs(x,y,0);
    64             if (flag) break;
    65         }
    66         if (flag) printf("%d
    ",ans);
    67         else printf("-1
    ");
    68     }
    69     return 0;
    70 }
    NOI 2017 Bless All
  • 相关阅读:
    uva11025 The broken pedometer
    uva131 The Psychic Poker Player
    子集生成算法
    uva10167 Birthday Cake
    poj1129 Channel Allocation
    poj2676 Sudoku
    Emacs杂谈(一)Emacs环境 c++ 快捷键
    poj1416 Shredding Company
    英文报刊推荐
    搜索练习(二)工作效益
  • 原文地址:https://www.cnblogs.com/abclzr/p/5042991.html
Copyright © 2011-2022 走看看