HDU 2828

//杭电 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;
}

你可能感兴趣的:(HDU)