题目是:“迷宫”题:从图左边入口处的2011进去,在迷宫里转悠,最后变成2012从右边出来。可以在迷宫里转圈,可以重复之前走过的路,但不能回退。
代码很乱
下面是运行效果和代码,计算是从下往上依次计算,回溯就没调整顺序了,从下往上啊!
- // funny.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <iostream>
- #include <string>
- #include <cstdlib>
- using namespace std;
- struct node
- {
- int stat;
- double num;
- int parent;
- };
- double eps=0.00000000001;
- node queue[10000000];
- int l=0,r=1;
- void backforanswer(int k)
- {
- while (queue[k].parent!=-1)
- {
- if (queue[k].num/queue[queue[k].parent].num==3)
- {
- cout<<"*3"<<endl;
- } else
- if (queue[k].num-queue[queue[k].parent].num==7)
- {
- cout<<"+7"<<endl;
- } else
- if (queue[k].num-queue[queue[k].parent].num==-5)
- {
- cout<<"-5"<<endl;
- } else
- if (queue[queue[k].parent].num/queue[k].num==2)
- {
- cout<<"/2"<<endl;
- }
- k=queue[k].parent;
- }
- }
- void bfs()
- {
- node now;
- bool flag=true;
- while (flag)
- {
- now=queue[l];
- l+=1;
- switch(now.stat)
- {
- case 0: queue[r].stat=2;queue[r].parent=l-1;queue[r].num=now.num+7;r+=1;
- if (int(now.num) % 2 ==0){queue[r].stat=4;queue[r].parent=l-1;queue[r].num=now.num/2.0;r+=1;}
- break;
- case 1: if (int(now.num) % 2 ==0) {queue[r].stat=4;queue[r].parent=l-1;queue[r].num=now.num/2.0;r+=1;}break;
- case 2: if (now.num<1000000){queue[r].stat=7;queue[r].parent=l-1;queue[r].num=now.num*3;r+=1;}
- queue[r].stat=8;queue[r].parent=l-1;queue[r].num=now.num-5;r+=1;
- if (int(now.num) % 2 ==0){ queue[r].stat=3;queue[r].parent=l-1;queue[r].num=now.num/2.0;r+=1;}
- break;
- case 3: queue[r].stat=2;queue[r].parent=l-1;queue[r].num=now.num+7;r+=1;
- break;
- case 4: if (now.num<1000000){ queue[r].stat=7;queue[r].parent=l-1;queue[r].num=now.num*3;r+=1;}
- queue[r].stat=8;queue[r].parent=l-1;queue[r].num=now.num-5;r+=1;
- queue[r].stat=1;queue[r].parent=l-1;queue[r].num=now.num+7;r+=1;
- break;
- case 5: queue[r].stat=1;queue[r].parent=l-1;queue[r].num=now.num+7;r+=1;
- queue[r].stat=8;queue[r].parent=l-1;queue[r].num=now.num-5;r+=1;
- if (int(now.num) % 2 ==0){ queue[r].stat=3;queue[r].parent=l-1;queue[r].num=now.num/2.0;r+=1; }
- break;
- case 6: queue[r].stat=1;queue[r].parent=l-1;queue[r].num=now.num+7;r+=1;
- if (int(now.num) % 2 ==0){ queue[r].stat=3;queue[r].parent=l-1;queue[r].num=now.num/2.0;r+=1;}
- if (now.num<1000000){ queue[r].stat=7;queue[r].parent=l-1;queue[r].num=now.num*3;r+=1;}
- break;
- case 7:
- if (int(now.num)==2012)
- {
- flag=false;
- backforanswer(l-1);
- break;
- } else
- {
- queue[r].stat=6;queue[r].parent=l-1;queue[r].num=now.num-5;r+=1;
- }
- break;
- case 8:
- if (int(now.num)==2012)
- {
- flag=false;
- backforanswer(l-1);
- break;
- } else
- {
- if (now.num<1000000){ queue[r].stat=5;queue[r].parent=l-1;queue[r].num=now.num*3;r+=1; }
- }
- break;
- case 9: break;
- }
- }
- }
- int main()
- {
- queue[0].stat=0;
- queue[0].num=2011;
- queue[0].parent=-1;
- bfs();
- return 0;
- }