51cto写到一半打不开了。。。。。到csdn上写
题目是:“迷宫”题:从图左边入口处的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;
}