zoukankan      html  css  js  c++  java
  • codevs2495 水叮当的舞步 IDA*

    我打暴力不对,于是就看看题解,,,,,,IDA*就是限制搜索深度而已,这句话给那些会A*但不知道IDA*是什么玩意的小朋友

    看题解请点击这里

    上方题解没看懂的看看这:把左上角的一团相同颜色的范围,那个范围周围的一圈,和剩余范围分别用c[i][j]赋值为1,2,0。然后做IDA*,限制搜索深度,估值函数h为c[i][j]不为1的范围中的不同颜色数目,意思是至少要多少次才能达到要求。ans不断迭代,如果g+h>ans则退出,如果c数组全为1则说明找到方案。感觉IDA*比A*编程难度简单好多,不用建堆,不过就是比较难想出迭代加深的方案。

    my code如下:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 int N,a[9][9],c[9][9],dx[4]={1,0,-1,0},dy[4]={0,1,0,-1},ans;
     6 bool flag,vis[6];
     7 int astarh()
     8 {
     9     int i,j,t=0; memset(vis,0,sizeof(vis));
    10     for (i=1;i<=N;++i) for (j=1;j<=N;++j)
    11      if ((c[i][j]!=1)&&(vis[a[i][j]]==0))
    12       {vis[a[i][j]]=1;t++;} return t;
    13 }
    14 void dfs(int x,int y)
    15 {
    16     int i,j,nowx,nowy;
    17     c[x][y]=1;
    18     for (i=0;i<4;++i)
    19     {
    20         nowx=x+dx[i]; nowy=y+dy[i];
    21         if ((nowx<1)||(nowx>N)||(nowy<1)||(nowy>N)||(c[nowx][nowy]==1)) continue;
    22         c[nowx][nowy]=2; if (a[x][y]==a[nowx][nowy]) dfs(nowx,nowy);
    23     }
    24 }
    25 bool can(int k)
    26 {
    27     int i,j; bool p=0;
    28     for (i=1;i<=N;++i) for (j=1;j<=N;++j)
    29      if ((c[i][j]==2)&&(a[i][j]==k))
    30       {p=1; dfs(i,j);} return p;
    31 }
    32 void work(int k)
    33 {
    34     int pd=astarh();
    35     if (k+pd>ans) return;
    36     if (pd==0) {flag=1;return;}
    37     int tm[9][9],i;
    38     for (i=0;i<=5;++i)
    39     {
    40         memcpy(tm,c,sizeof(c));
    41         if (can(i)) work(k+1);
    42         memcpy(c,tm,sizeof(c));
    43     }
    44 }
    45 int main()
    46 {
    47     int i,j;
    48     scanf("%d",&N);
    49     while (N)
    50     {
    51         for (i=1;i<=N;++i) for (j=1;j<=N;++j) scanf("%d",&a[i][j]);
    52         memset(c,0,sizeof(c)); dfs(1,1); flag=0;
    53         for (ans=0;ans<=N*N;++ans)
    54          {work(0); if (flag) {printf("%d
    ",ans);break;}}
    55         scanf("%d",&N);
    56     }
    57     return 0;
    58 }
    NOI 2017 Bless All
  • 相关阅读:
    Django 初试水(一)
    自己动手系列----使用数组实现一个简单的Set
    自己动手系列----使用数组实现一个简单的Map
    DB2中的MQT优化机制详解和实践
    Airy Memory 内存清理 + 注册码
    eclipse 工具翻译插件安装
    用sysdba登录oracle 11g数据库时遇到已连接到空闲例程 ora-013113
    Firewall 防火墙规则
    未找到段的定义
    ORACLE 锁表的解决方法 ORA-00054
  • 原文地址:https://www.cnblogs.com/abclzr/p/5051748.html
Copyright © 2011-2022 走看看