• 十滴水,半成品,大多数关卡可以过去,不过也有几个过不去,仍在调试中,不断更新


      1 /*
      2 宽搜+记忆化搜索
      3 */
      4 #include <iostream>
      5 #include <cstdio>
      6 #include <string>
      7 #include <queue>
      8 #include <string>
      9 #define  leftedge 1
     10 #define  rightedge    5
     11 #define  topedge  1
     12 #define  downedge 6
     13 using namespace std;
     14 struct status{
     15     int map[7][6];
     16     int step;
     17 };
     18 bool success;
     19 int resx,resy;
     20 int steps[1000];
     21 int limit;
     22 void output(status s){
     23     int i,j;
     24     printf("
    
    ---------------
    ");
     25     for(i=topedge;i<=downedge;++i){
     26         for(j=leftedge;j<=rightedge;++j)
     27             printf("%d ",s.map[i][j]);
     28         printf("
    ");
     29     }
     30     printf("---------------
    
    
    ");
     31     return;
     32 }
     33 
     34 bool check(status s){
     35     int i,j;
     36     for(i=topedge;i<=downedge;++i)
     37         for(j=leftedge;j<=rightedge;++j){
     38             if(s.map[i][j]!=0) return 0;
     39         }
     40     return 1;
     41 }
     42 struct node{
     43     int x,y;
     44 };
     45 status update(int x,int y,status s){  //已经爆了的气球
     46     queue<node>order;
     47     while(order.size()>0) order.pop();
     48     int i,j,k,ii,jj,tx,ty;
     49     node t,t1,t2;
     50     t.x=x;  t.y=y;
     51     order.push(t);
     52     while(order.size()>0){
     53         t1=order.front();
     54         tx=t1.x;    ty=t1.y;
     55         order.pop();
     56         s.map[tx][ty]=0;
     57         for(i=tx-1;i>=topedge;--i){
     58             if(s.map[i][ty]==0) continue;
     59             else {
     60                 s.map[i][ty]++; t2.x=i; t2.y=ty;
     61                 if(s.map[i][ty]==5) {s.map[i][ty]=0;order.push(t2);}
     62                 break;
     63             }
     64         }
     65         for(i=tx+1;i<=downedge;++i){
     66             if(s.map[i][ty]==0) continue;
     67             else {
     68                 s.map[i][ty]++; t2.x=i; t2.y=ty;
     69                 if(s.map[i][ty]==5) {s.map[i][ty]=0;order.push(t2);}
     70                 break;
     71             }
     72         }
     73         for(i=ty-1;i>=leftedge;--i){
     74             if(s.map[tx][i]==0) continue;
     75             else {
     76                 s.map[tx][i]++; t2.x=tx; t2.y=i;
     77                 if(s.map[tx][i]==5) {s.map[tx][i]=0;order.push(t2);}
     78                 break;
     79             }
     80         }
     81         for(i=ty+1;i<=rightedge;++i){
     82             if(s.map[tx][i]==0) continue;
     83             else {
     84                 s.map[tx][i]++; t2.x=tx; t2.y=i;
     85                 if(s.map[tx][i]==5) {s.map[tx][i]=0;order.push(t2);}
     86                 break;
     87             }
     88         }
     89     }
     90     if(check(s)==1) {resx=x;resy=y; success=1;output(s);}
     91     //output(s);
     92     return s;
     93 }
     94 void change(int step,status s){
     95     int i,j,ii,jj;
     96     status temp;
     97     if(success==1||step>limit||check(s)==1)
     98         return;
     99     for(i=topedge;i<=downedge;++i)
    100         for(j=leftedge;j<=rightedge;++j){
    101             temp=s;
    102             if(temp.map[i][j]==0) continue;
    103             temp.map[i][j]++;
    104 
    105             temp.step=i*10+j;
    106             steps[step*100+temp.step]=s.step;
    107 
    108 
    109 
    110             if(temp.map[i][j]==5) temp=update(i,j,temp);
    111             if(success==1){
    112                 return;
    113             }
    114             change(step+1,temp);
    115             if(success==1){
    116                 printf("ok
    ");
    117 
    118 
    119 
    120 
    121                 return ;
    122             }
    123 
    124 
    125 
    126         }
    127     return;
    128 }
    129 int main(){
    130     int i,j,tx,ty;
    131     status s;
    132     int res[10];
    133     while(true){
    134         success=0;
    135         printf("请输入限制步数
    ");
    136         scanf("%d",&limit);
    137         for(i=topedge;i<=downedge;++i)
    138             for(j=leftedge;j<=rightedge;++j)
    139                 scanf("%d",&s.map[i][j]);
    140         s.step=0;
    141 
    142         change(1,s);
    143         printf("success=%d
    ",success);
    144 
    145 
    146         res[limit]=limit*100+resx*10+resy;
    147         tx=resx;    ty=resy;
    148 
    149         for(i=limit-1;i>=1;--i){
    150             res[i]= steps[ (i+1)*100+ tx*10+ty  ];
    151             tx=res[i]/10;   ty=res[i]%10;
    152         }
    153         for(i=1;i<=limit;i++)
    154         {
    155             res[i]=res[i]%100;
    156             printf("%d %d
    ",res[i]/10,res[i]%10);
    157         }
    158     }
    159     return 0;
    160 }
  • 相关阅读:
    预搜索,不匹配;反向预搜索,不匹配
    反向引用 /1, /2...
    贪婪与非贪婪模式
    其他一些代表抽象意义的特殊符号
    修饰匹配次数的特殊符号
    自定义能够匹配 ' 多种字符' 的表达式
    能够与 ' 多种字符' 匹配的表达式
    6)添加带有颜色的那个画板
    5)添加快捷键
    4)记住我的图形
  • 原文地址:https://www.cnblogs.com/symons1992/p/3318307.html
Copyright © 2020-2023  润新知