C++破解小游戏--九连环

结果

3411--1
  2--3
  3--1
  4--2
  5--1
  6--5
  7--1
  8--2
  9--1
 10--3
 11--1
 12--2
 13--1
 14--4
 15--1
 16--2
 17--1
 18--3
 19--1
 20--2
 21--1
 22--7
 23--1
 24--2
 25--1
 26--3
 27--1
 28--2
 29--1
 30--4
 31--1
 32--2
 33--1
 34--3
 35--1
 36--2
 37--1
 38--5
 39--1
 40--2
 41--1
 42--3
 43--1
 44--2
 45--1
 46--4
 47--1
 48--2
 49--1
 50--3
 51--1
 52--2
 53--1
 54--6
 55--1
 56--2
 57--1
 58--3
 59--1
 60--2
 61--1
 62--4
 63--1
 64--2
 65--1
 66--3
 67--1
 68--2
 69--1
 70--5
 71--1
 72--2
 73--1
 74--3
 75--1
 76--2
 77--1
 78--4
 79--1
 80--2
 81--1
 82--3
 83--1
 84--2
 85--1
 86--9
 87--1
 88--2
 89--1
 90--3
 91--1
 92--2
 93--1
 94--4
 95--1
 96--2
 97--1
 98--3
 99--1
100--2
101--1
102--5
103--1
104--2
105--1
106--3
107--1
108--2
109--1
110--4
111--1
112--2
113--1
114--3
115--1
116--2
117--1
118--6
119--1
120--2
121--1
122--3
123--1
124--2
125--1
126--4
127--1
128--2
129--1
130--3
131--1
132--2
133--1
134--5
135--1
136--2
137--1
138--3
139--1
140--2
141--1
142--4
143--1
144--2
145--1
146--3
147--1
148--2
149--1
150--7
151--1
152--2
153--1
154--3
155--1
156--2
157--1
158--4
159--1
160--2
161--1
162--3
163--1
164--2
165--1
166--5
167--1
168--2
169--1
170--3
171--1
172--2
173--1
174--4
175--1
176--2
177--1
178--3
179--1
180--2
181--1
182--6
183--1
184--2
185--1
186--3
187--1
188--2
189--1
190--4
191--1
192--2
193--1
194--3
195--1
196--2
197--1
198--5
199--1
200--2
201--1
202--3
203--1
204--2
205--1
206--4
207--1
208--2
209--1
210--3
211--1
212--2
213--1
214--8
215--1
216--2
217--1
218--3
219--1
220--2
221--1
222--4
223--1
224--2
225--1
226--3
227--1
228--2
229--1
230--5
231--1
232--2
233--1
234--3
235--1
236--2
237--1
238--4
239--1
240--2
241--1
242--3
243--1
244--2
245--1
246--6
247--1
248--2
249--1
250--3
251--1
252--2
253--1
254--4
255--1
256--2
257--1
258--3
259--1
260--2
261--1
262--5
263--1
264--2
265--1
266--3
267--1
268--2
269--1
270--4
271--1
272--2
273--1
274--3
275--1
276--2
277--1
278--7
279--1
280--2
281--1
282--3
283--1
284--2
285--1
286--4
287--1
288--2
289--1
290--3
291--1
292--2
293--1
294--5
295--1
296--2
297--1
298--3
299--1
300--2
301--1
302--4
303--1
304--2
305--1
306--3
307--1
308--2
309--1
310--6
311--1
312--2
313--1
314--3
315--1
316--2
317--1
318--4
319--1
320--2
321--1
322--3
323--1
324--2
325--1
326--5
327--1
328--2
329--1
330--3
331--1
332--2
333--1
334--4
335--1
336--2
337--1
338--3
339--1
340--2
341--1

源代码

//头文件 
#include<bits/stdc++.h>
using namespace std;

//步骤 
class step{
	public:
		//环状态 
		vector<int> v;
		//过程 
		vector<int> r;
		
		//无参构造 
		step(){
			this->v.clear();
			for(int i=0;i<9;i++){
				v.push_back(1);
			}
			this->r.clear();
		}
		
		//带参构造 
		step(const step &s){
			this->v=s.v;
			this->r=s.r;
		}
		
		//键 
		int key(){
			int sum=0;
			for(int i=0;i<v.size();i++){
				sum=sum*2+v[i];
			}	
			return sum;
		}
		
		//i号是否可以移动 
		bool can(int i){
			if(i==0){
				return true;
			}
			
			if(v[i-1]==0){
				return false;
			}
			
			for(int j=0;j<i-1;j++){
				if(v[j]==1){
					return false;
				}
			}
			
			return true;
		}

		//移动i号 
		void change(int i){
			this->v[i]=1-this->v[i];
			this->r.push_back(i+1);
		}
		
		//是否已经解开 
		bool success(){
			for(int i=0;i<this->v.size();i++){
				if(this->v[i]==1){
					return false;
				}
			}
			return true;
		}

		//展示移动过程 
		void display(){
			cout<<this->r.size()<<"步"<<endl;
			cout<<endl;
			for(int i=0;i<this->r.size();i++){
				printf("%3d--%d\n",i+1,this->r[i]);
			}
		}
};

//主函数 
int main(){
	
	//初始 
	step first;
	//当前 
	step now;
	//下一个 
	step next;
	
	//队列 
	queue<step> q;
	q.push(first);
	
	//哈希表 
	map<int,step> m;
	m.insert(pair<int,step>(first.key(),first));
	
	//队列元素个数大于0 
	while(q.size()>0){
		//获取队头 
		now=q.front();
		
		//去掉经过移动的局面 
		q.pop();
		
		//解决问题时退出循环 
		if(now.success()){
			//先打印结果 
			now.display();
			break;
		}
		
		//依次判断目前局面的所有环,能动的就挤进队列中,同时保存该局面避免重复 
		for(int i=0;i<now.v.size();i++){
			if(now.can(i)){
				next=now;
				next.change(i);
				
				if(m.find(next.key())==m.end()){
					q.push(next);
					m.insert(pair<int,step>(next.key(),next));
				}
			}
		}
	}
	
	return 0; 
}

注意事项

1、“最少”问题我们一般都会将算法定位到广度优先搜索中
2、广搜需要注意给自定义数据结构设置好比较容易计算和比较的键来排重
3、我们在写之前要明确节点要拥有的属性和方法:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值