BZOJ1085(SCOI2005)[骑士精神]--IDA*

来源:互联网 发布:田中真弓等级知乎 编辑:程序博客网 时间:2024/05/17 22:11

【链接】
bzoj1085

【解题报告】

IDA*裸题。

#include<cstdio>#include<algorithm>using namespace std;const int flg[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};const char c[6][6]={{},                    {'#','1','1','1','1','1'},                    {'#','0','1','1','1','1'},                    {'#','0','0','*','1','1'},                    {'#','0','0','0','0','1'},                    {'#','0','0','0','0','0'}};int T,ans,sx,sy,a[6][6];inline char Readc(){    char ch=getchar();    while (ch!='0'&&ch!='1'&&ch!='*') ch=getchar();    return ch;}int H(){    int sum=0;    for (int i=1; i<=5; i++)     for (int j=1; j<=5; j++)      if (a[i][j]!=c[i][j]) sum++;    return sum;}bool Check(int x,int y) {return x>0&&x<=5&&y>0&&y<=5;}bool IDA_star(int dep,int x,int y){    if (dep+H()-1>ans) return 0;    if (!H()) return 1;    for (int i=0; i<=7; i++)     if (Check(x+flg[i][0],y+flg[i][1]))      {        swap(a[x][y],a[x+flg[i][0]][y+flg[i][1]]);        bool now=IDA_star(dep+1,x+flg[i][0],y+flg[i][1]);        swap(a[x][y],a[x+flg[i][0]][y+flg[i][1]]);        if (now) return 1;      }    return 0;}void Work(){    for (int i=1; i<=5; i++)     for (int j=1; j<=5; j++)      {        a[i][j]=Readc();        if (a[i][j]=='*') sx=i,sy=j;      }    for (ans=0; ans<=15&&!IDA_star(0,sx,sy); ans++);    if (ans>15) printf("-1"); else printf("%d",ans); putchar(10);}int main(){    freopen("1085.in","r",stdin);    freopen("1085.out","w",stdout);    scanf("%d",&T);    while (T--) Work();    return 0;}
原创粉丝点击