您的位置:首页 > 其它

UVA 321 - The New Villa

2013-02-07 13:57 399 查看
/* bfs找最短路,hash判重 二进制的状态压缩

*/

#include<cstdio>

#include<cstring>

#include<vector>

#include<cstdlib>

using namespace std;

vector<int> G[20];

vector<int> sw[20];

int r,d,s;

int vis[2000000];

struct node

{

int r,step,light,fr;

} p[200000];

void init()

{

memset(p,0,sizeof(p));

memset(vis,0,sizeof(vis));

for(int i = 0; i < 20; i++)

{

G[i].clear();

sw[i].clear();

}

}

int insert(int x)

{

int temp = p[x].light*10 + p[x].r-1;

if(vis[temp])

return 0;

return vis[temp]=1;

}

int cal(int x,int y)

{

x = abs(x-y);

for(int i = 0; i < 20; i++)

{

if(x==(1<<i)) return i+1;

}

}

int print(int u)

{

int v = p[u].fr;

if(v)

print(v);

if(p[v].r==p[u].r&&p[u].light<p[v].light)

printf("- Switch off light in room %d.\n",cal(p[u].light,p[v].light));

else if(p[v].r==p[u].r&&p[u].light>p[v].light)

printf("- Switch on light in room %d.\n",cal(p[u].light,p[v].light));

else if(p[v].r!=p[u].r)

printf("- Move to room %d.\n",p[u].r);

}

int bfs()

{

int fronts = 0,rears=1;

p[fronts].fr=0;

p[fronts].light=1;

p[fronts].r=1;

p[fronts].step=0;

insert(0);

while(fronts<rears)

{

int x = p[fronts].r;

if(x==r&&p[fronts].light==1<<(x-1))

{

printf("The problem can be solved in %d steps:\n",p[fronts].step);

print(fronts);

return 0;

}

for(int i = 0; i < G[x].size(); i++)

{

if((1<<(G[x][i]-1))&p[fronts].light)

{

p[rears].fr=fronts;

p[rears].light = p[fronts].light;

p[rears].step = p[fronts].step+1;

p[rears].r = G[x][i];

if(insert(rears))

{

rears++;

}

}

}

for(int i = 0; i < sw[x].size(); i++)

{

p[rears].fr=fronts;

p[rears].step = p[fronts].step + 1;

p[rears].r = p[fronts].r;

if((1<<(sw[x][i]-1))&p[fronts].light)

p[rears].light = p[fronts].light - (1<<(sw[x][i]-1));

else

p[rears].light = p[fronts].light + (1<<(sw[x][i]-1));

if((((1<<x-1))&p[rears].light)&&insert(rears))

{

rears++;

}

}

fronts++;

}

printf("The problem cannot be solved.\n");

}

int main()

{

int a,b,kc=0;

while(scanf("%d %d %d",&r,&d,&s)==3)

{

if(!r&&!d&&!s) break;

init();

//printf("%d %d %d\n",r,d,s);

for(int i = 0; i < d; i++)

{

scanf("%d %d",&a,&b);

G[a].push_back(b);

G[b].push_back(a);

}

for(int i = 0; i < s; i++)

{

scanf("%d %d",&a,&b);

sw[a].push_back(b);

}

printf("Villa #%d\n",++kc);

bfs();

printf("\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: