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

  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("\n\n---------------\n");
 25     for(i=topedge;i<=downedge;++i){
 26         for(j=leftedge;j<=rightedge;++j)
 27             printf("%d ",s.map[i][j]);
 28         printf("\n");
 29     }
 30     printf("---------------\n\n\n");
 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\n");
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("请输入限制步数\n");
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\n",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\n",res[i]/10,res[i]%10);
157         }
158     }
159     return 0;
160 }

 

posted on 2013-09-13 01:29 symons 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/symons1992/p/3318307.html

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计,皆可应用在项目、毕业设计、课程设计、期末/期/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值