321

I used bit operation to represent the states of the switches state of the villa.

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <sstream>
#include <string>
#include <cstring>
#include <cmath>

using namespace std;

struct Point{
	int x,y;
};
int kase=1;
Point points[11500];
int arr[11][1024];
int array_map_par[11500];
bool door[15][15];
bool light_swtch[15][15];
bool flag;
int RR,DD,SS;
int gr[11][1024];

int checkbit(int num,int idx)
{
	return (num&(1<<(idx-1)));
}
void bfs()
{
	int bit;
	vector<string> vb;
	string str[11500];
	queue<int> q;
	int step;
	gr[1][1]=1;
	q.push(1);q.push(1);q.push(0);
	while(!q.empty())
	{
		int rum=q.front();q.pop();
		int res=q.front();q.pop();
		int status_vila = res;
		int num=res;
		int parent_index = arr[rum][res];
		step=q.front();q.pop();
		if(rum==RR && res==(1<<(RR-1)))
		{
			printf("Villa #%d\nThe problem can be solved in %d steps:\n",kase++,step);

			flag=1;
			while(array_map_par[parent_index]!=-1)
			{
				vb.push_back(str[parent_index]);
				parent_index = array_map_par[parent_index];
			}
			for(int II=vb.size()-1;II>=0;II--)
			cout<<vb[II];
			return;
		}
		for(int i=1;i<=RR;i++)
		{
			if(light_swtch[rum][i])
			{
				bit=checkbit(res,i);
				if(bit==0)
				{
					status_vila = res | (1<<(i-1));
					if(gr[rum][status_vila]==0)
					{
						gr[rum][status_vila]=1;
						q.push(rum);q.push(status_vila);
						q.push(step+1);
						array_map_par[arr[rum][status_vila]]=parent_index;
						str[arr[rum][status_vila]]="- Switch on light in room ";
						if(i<10)
						str[arr[rum][status_vila]].append(1u,char(i+'0'));
						else
							str[arr[rum][status_vila]].append("10");
						str[arr[rum][status_vila]].append(".\n");
					}
				}
				else
				{
					status_vila = res & (~(1<<(i-1)));
					if(gr[rum][status_vila]==0 && rum!=i)//cant switch off the room where he is in
					{
						gr[rum][status_vila]=1;
						q.push(rum);q.push(status_vila);
						q.push(step+1);
						array_map_par[arr[rum][status_vila]]=parent_index;
						str[arr[rum][status_vila]]="- Switch off light in room ";
						if(i<10)
							str[arr[rum][status_vila]].append(1u,char(i+'0'));
						else
							str[arr[rum][status_vila]].append("10");
						str[arr[rum][status_vila]].append(".\n");
					}
				}

			}
		}
		int rum_index=0;
		while(num)
		{
			rum_index+=1;
			bit = (num&1);
			num=(num>>1);
			if(door[rum][rum_index]==0)
			continue;
			if(bit)
			{
				if(gr[rum_index][res]==0)
				{
					gr[rum_index][res]=1;
					q.push(rum_index);q.push(res);
					q.push(step+1);
					array_map_par[arr[rum_index][res]]=parent_index;
					str[arr[rum_index][res]]="- Move to room ";
					if(rum_index<10)
					str[arr[rum_index][res]].append(1u,char(rum_index+'0'));
					else
					str[arr[rum_index][res]].append("10");
					str[arr[rum_index][res]].append(".\n");

				}
			}
		}

	}

}

void _init()
{
	int cnt=1;
	for(int i=1;i<11;i++)
	{
		for(int j=1;j<1024;j++)
		{
			points[cnt].x=i;points[cnt].y=j;
			arr[i][j]=cnt;cnt+=1;
		}
	}
}
int main()
{
	int a,b;
	_init();
	while(scanf("%d%d%d",&RR,&DD,&SS))
	{
		if(RR+DD+SS==0)
		break;
		memset(door,0,sizeof(door));
		memset(gr,0,sizeof(gr));
		memset(light_swtch,0,sizeof(light_swtch));
		memset(array_map_par,-1,sizeof(array_map_par));

		for(int i=1;i<=DD;i++)
		{
			scanf("%d%d",&a,&b);door[a][b]=1;door[b][a]=1;
		}
		for(int i=1;i<=SS;i++)
		{
			scanf("%d%d",&a,&b);light_swtch[a][b]=1;
		}
		flag=0;
		bfs();
		if(!flag)
		printf("Villa #%d\nThe problem cannot be solved.\n\n",kase++);
		else
		printf("\n");

	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *