• 【BZOJ1085】迭代加深+启发式搜索


    分析
    跳马,首先跳马写起来就很复杂了。我们跳空格就行了。

    然后,我一看这个题,15步以上就算-1,那好啊,直接写了个爆搜。
    结果样例都跑不出来。。
    遂考虑启发式搜索。
    评估函数很显然,现在有多少个没归位,那我最少就要跳这么多次。
    然后再加个迭代加深吧。

    然后我因为dx,dy手残写错了自闭了半个多小时…

    这个题目算是显示图的搜索技巧吧。主要是启发式搜索和迭代加深的使用。

    就没了。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 10;
    int dx[]={1,1,-1,-1,2,2,-2,-2};
    int dy[]={2,-2,2,-2,1,-1,1,-1};
    char G[maxn][maxn];
    bool found = false;
    char a[6][6]={
    '0','0','0','0','0','0',
    '0','1','1','1','1','1',
    '0','0','1','1','1','1',
    '0','0','0','*','1','1',
    '0','0','0','0','0','1',
    '0','0','0','0','0','0'};
    bool check()
    {
    for(int i=1;i<=5;i++)
    {
    for(int j=1;j<=5;j++)
    {
    if(G[i][j]!=a[i][j]) return false;
    }
    }
    return true;
    }
    bool eva(int now,int t)
    {
    int cnt = 0;
    for(int i=1;i<=5;i++)
    {
    for(int j=1;j<=5;j++)
    {
    if(G[i][j]!=a[i][j]) cnt++;
    }
    }
    if(cnt+now>t) return false;
    return true;
    }
    void dfs(int x,int y,int t,int stp)
    {
    if(t==stp)
    {
    if(check()) found = true;
    return;
    }
    if(found) return;
    for(int i=0;i<8;i++)
    {
    int nx = x+dx[i];
    int ny = y+dy[i];
    if(nx>=1 && nx<=5 && ny>=1 && ny<=5)
    {
    swap(G[nx][ny],G[x][y]);
    if(eva(stp,t)) dfs(nx,ny,t,stp+1);
    swap(G[nx][ny],G[x][y]);
    }
    }
    }
    int main(http://www.my516.com)
    {
    int T;
    cin>>T;
    while(T--)
    {
    int sx,sy;
    found = false;
    for(int i=1;i<=5;i++)
    {
    for(int j=1;j<=5;j++)
    {
    cin>>G[i][j];
    if(G[i][j]=='*') sx = i,sy = j;
    }
    }
    for(int i=0;i<=15;i++)
    {
    dfs(sx,sy,i,0);
    if(found)
    {
    printf("%d ",i);
    break;
    }
    }
    if(!found) printf("-1 ");
    }
    return 0;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87

    ---------------------

  • 相关阅读:
    SQList基础+ListView基本使用
    Git本地上传口令
    记住用户名和登录密码+虚拟机没有root权限解决办法
    API+gir上传错误解决办法
    界面跳转+信息传递+AS中如何将ADV转移到其他盘中
    界面跳转
    Android学习——ListView
    开课第一周周总结
    体温上报APP——班级统计
    体温上报APP——打印
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11109112.html
Copyright © 2020-2023  润新知