uva321 bfs搜索

2014-11-24 02:02:49 · 作者: · 浏览: 1
这道题 系统没法提交,所以不知道能否AC,但我感觉程序没啥问题,比较简单,可以跑几个测试用例比对一下。
题意容易理解,思路 是将所在的房间号和r个房间的开灯情况作为一个状态,这样最多会有10*2^10种状态,并不多。然后就是bfs宽度遍历了,要注意一点是人在某个房间中不可以把该房间的灯关上,所以我在输入的灯开关数组时候就做了一个判断,如果两个数字相同,也即控制该房间灯的开关就在这个房间时,开关是无效的(很不符合常理~~)这样就保证了之后开关灯的合法性。
#include  
#include  
#include  
using namespace std;  
  
const int MAXSIZE = 60000;  
const int N=11;  
  
struct state  
{  
    int room[N];  
    int location,behave;  
};  
  
int r,d,s,front,rear,step,prestate[MAXSIZE];  
bool flag,door[N][N],swit[N][N],vis[N][1025];  
state target,S[MAXSIZE];  
void init()  
{  
    memset(swit,0,sizeof(swit));  
    memset(door,0,sizeof(door));  
    memset(S,0,sizeof(S));  
    memset(vis,0,sizeof(vis));  
    S[0].room[1]=1;  
    S[0].location=1;  
    vis[1][1]=1;  
    target.location=r;  
    memset(target.room,0,sizeof(target.room));  
    target.room[r]=1;  
}  
int caldex(state s)  
{  
    int dex=0,exp=1;  
    for (int i=1;i<=r;i++)  
    {  
        dex=dex+s.room[i]*exp;  
        exp=exp << 1 ;  
    }  
    return dex;  
}  
bool compare(state s)  
{  
    if (s.location==target.location)  
    {  
        for (int i=1;i<=r;i++)  
        {  
            if (s.room[i]!=target.room[i])  
                return 0;  
        }  
        return 1;  
    }  
    return 0;  
}  
void bfs()  
{  
    front=0;rear=1,step=0,flag=0;  
    while (front
300) { cout<<"Move to room "<>r>>d>>s&&r) { col++; init(); for (int i=0;i>m>>n; door[m][n]=door[n][m]=1; } for (int i=0;i>m>>n; if (m!=n) swit[m][n]=1; } bfs(); cout<<"Villa #"<=0;j--) { print(S[result[j]]); } delete result; } else cout<<"The problem cannot be solved."<