//杭电 2828 精题
//解题思路:深度优先搜索
#include <iostream>
#include <string>
using namespace std;
#define arraysize 501
int n,m;
typedef struct swch //定义开关
{
int status; //定义开关的状态
int num; //定义开关的标识
}swch;
typedef struct lamp
{
swch swchs[arraysize];
int swchnum; //定义灯包括的开关数
}lamp; //定义灯
lamp lamps[arraysize];
bool final[arraysize]; //深度优先搜索中标识该开关是否被搜索过
string stron("ON");
string stroff("OFF");
bool flag = false; //由于题目只要求输出一个结果,所以flag为true用于标识已经找到了该结果
int result[arraysize]; //记录所有开关的状态
void DFS(int k) //对第k灯进行搜索
{
int i,j;
if(k==n+1) //此处是k=n+1
{
flag = true; //代表找到了结果
for(i=1;i<m;++i) //用此种方式输出格式
{
if(result[i])
cout<<"ON ";
else
cout<<"OFF ";
}
if(result[m])
cout<<"ON"<<endl;
else
cout<<"OFF"<<endl;
}
for(i=1;i<lamps[k].swchnum+1 && !flag;++i) //对k灯的所有开关进行遍历,flag的使用不错
{
if(!final[lamps[k].swchs[i].num]) //如果该开关没有被使用
{
final[lamps[k].swchs[i].num] = true;
result[lamps[k].swchs[i].num] = lamps[k].swchs[i].status; //记录开关的状态
DFS(k+1);
final[lamps[k].swchs[i].num] = false;
}
else if(final[lamps[k].swchs[i].num] && lamps[k].swchs[i].status == result[lamps[k].swchs[i].num]) //如果该开关被使用并且可以使该灯亮则继续搜索下一灯
{
DFS(k+1);
}
}
}
int main()
{
int i,j;
//freopen("1.txt","r",stdin);
while(cin>>n>>m)
{
int tempout;
int tempin;
flag = false;
string tempstr;
memset(final,0,sizeof(final));
memset(result,0,sizeof(result));
for(i=1;i<n+1;++i)
{
cin>>tempout;
lamps[i].swchnum = tempout;
for(j=1;j<tempout+1;++j)
{
cin>>tempin>>tempstr;
if(tempstr==stron)
{
lamps[i].swchs[j].status = 1;
}
else
lamps[i].swchs[j].status = 0;
lamps[i].swchs[j].num = tempin;
}
}
DFS(1);
if(!flag)
cout<<"-1"<<endl;
}
return 0;
}
转载于:https://www.cnblogs.com/north_dragon/archive/2010/05/21/1740750.html