• bzoj1085: [SCOI2005]骑士精神


    为啥我以前辣么流弊又会IDA*又会迭代加深的我自己都不知道呢


    那么就是基本的了。

    但是有个问题就是迭代加深+IDA*的时候由于估的不准搞得好像要多找几层。。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int dx[8]={-2,-2,-1,-1,1,1,2,2};
    const int dy[8]={1,-1,2,-2,2,-2,1,-1};
    bool B[10][10];
    void yu()
    {
        B[1][1]=true; B[1][2]=true; B[1][3]=true; B[1][4]=true; B[1][5]=true;
        B[2][1]=false;B[2][2]=true; B[2][3]=true; B[2][4]=true; B[2][5]=true;
        B[3][1]=false;B[3][2]=false;B[3][3]=false;B[3][4]=true; B[3][5]=true;
        B[4][1]=false;B[4][2]=false;B[4][3]=false;B[4][4]=false;B[4][5]=true;
        B[5][1]=false;B[5][2]=false;B[5][3]=false;B[5][4]=false;B[5][5]=false;
    }
    
    int ans,kx,ky;bool mp[10][10];
    int count()
    {
        int ret=0;
        for(int i=1;i<=5;i++)
            for(int j=1;j<=5;j++)
                if(mp[i][j]!=B[i][j])ret++;
        return ret;
    }
    bool dfs(int k)
    {
        if(kx==3&&ky==3)
        {
            if(count()==0){printf("%d
    ",k);return true;}
        }
        if(k>=ans)return false;
        
        
        for(int i=0;i<=7;i++)
        {
            int tx=kx+dx[i],ty=ky+dy[i];
            if(tx>0&&tx<=5&&ty>0&&ty<=5)
            {
                swap(mp[kx][ky],mp[tx][ty]);
                swap(kx,tx);swap(ky,ty);
                if(count()+k+1<=ans)
                {
                    if(dfs(k+1))return true;
                }
                swap(kx,tx);swap(ky,ty);
                swap(mp[kx][ky],mp[tx][ty]);
            }
        }
        return false;
    }
    char ss[10];
    int main()
    {
        freopen("a.in","r",stdin);
        freopen("a.out","w",stdout);
        int T;
        scanf("%d",&T);yu();
        while(T--)
        {
            for(int i=1;i<=5;i++)
            {
                scanf("%s",ss+1);
                for(int j=1;j<=5;j++)
                {
                         if(ss[j]=='0')mp[i][j]=false;
                    else if(ss[j]=='1')mp[i][j]=true;
                    else kx=i, ky=j, mp[i][j]=false;
                }
            }
            for(ans=0;ans<=15;ans++)
            {
                if(dfs(0))break;
            }
            if(ans==16)printf("-1
    ");
        }
        return 0;
    }
  • 相关阅读:
    View Controller 生命周期的各个方法的用法
    IOS开发之Post 方式获取服务器数据
    委托代理
    Function
    SKPhysicsContactDelegate协议
    UITouch附加
    Remove Duplicates from Sorted Array II
    4Sum
    [Text Justification
    Count and Say
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9294464.html
Copyright © 2020-2023  润新知