栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1137 The New Villa

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1137 The New Villa

#include <iostream>#include <queue>#include <string.h>#include <algorithm>#define MAX_S 1024#define MAX_H 10using namespace std; struct statusN {     int rNum, bit, step;     statusN *next; }status[MAX_H + 2][MAX_S + 2]; struct doorN {     int f, t;     int getOpp(int curS) //-1 not exist     {         if(curS == f) return t;         else if(curS == t) return f;         else return -1;     } }door[MAX_H * MAX_H + 2]; struct controlN {     int hNum, lNum; }control[MAX_H * MAX_H + 2]; int v[MAX_H + 2][MAX_S + 2]; int exp[MAX_H + 2]; int roomNum, doorNum, switNum; int getLight(int ex) {     for(int i = 0; i < roomNum; i++)         if(exp[i] == ex)  return i;     return -1; } void print(statusN *cur) {     if(!cur->next)         return;     print(cur->next);     int bitT = cur->bit, bitF = cur->next->bit, room2 = cur->rNum, room1 = cur->next->rNum;     if(bitT == bitF)         cout<<"- Move to room "<<room2+1<<"."<<endl;     else     {         int ex = bitF ^ bitT;         int which = getLight(ex);         if(ex & bitT)  cout<<"- Switch on light in room "<<getLight(ex) + 1<<"."<<endl;         else  cout<<"- Switch off light in room "<<getLight(ex) + 1<<"."<<endl;     } } bool solve() {     memset(v, 0, sizeof(v));     statusN *final = &status[0][exp[0]];     final->next = NULL;     final->step = 0;         queue<statusN *> Q;     v[0][exp[0]] = true;     Q.push(final);     bool finish = false;     statusN *cur;     int i;     while(!Q.empty())     {         cur = Q.front();         Q.pop();         int bit = cur->bit, room = cur->rNum, step = cur->step;         if(bit == exp[roomNum - 1] && room == roomNum - 1)         {  finish = true;  break;         }         for(i = 0; i < doorNum; i++)         {  int opp;  if((opp = door[i].getOpp(room)) != -1 && (bit & exp[opp]) > 0 && (!v[opp][bit]))  {      v[opp][bit] = 1;      statusN *ns = &status[opp][bit];      ns->next = cur;      ns->step = step + 1;      Q.push(ns);  }         }         for(i = 0; i < switNum; i++)         {  int ctrlNum = control[i].lNum;  if(control[i].hNum == room)  {      int newBit = bit ^ exp[ctrlNum];      if(v[room][newBit])          continue;      v[room][newBit] = 1;      statusN *ns = &status[room][newBit];      ns->next = cur;      ns->step = step + 1;      Q.push(ns);  }         }     }     if(!finish)         return false;     cout<<"The problem can be solved in "<<cur->step<<" steps:"<<endl;     cur = &status[roomNum - 1][exp[roomNum - 1]];     print(cur);     return true;     } bool compare(controlN c1, controlN c2) {     if(c1.hNum < c2.hNum)         return true;     else if(c1.hNum == c2.hNum)     {         if(c1.lNum <= c2.lNum)  return true;         return false;     }     return false; } int main() {     int i, j, f, t;     exp[0] = 1;     for(i = 1; i <= MAX_H; i++)         exp[i] = exp[i - 1]<<1;     for(i = 0; i < MAX_H; i++)     {         for(j = 0; j < MAX_S; j++)         {  statusN cur = {i, j, 0, NULL};  status[i][j] = cur;         }     }     int caseN = 0;     while(cin>>roomNum>>doorNum>>switNum && (roomNum + doorNum + switNum) != 0)     {         caseN++;         for(i = 0; i < doorNum; i++)         {  cin>>f>>t;  doorN cur = {f - 1, t - 1};  door[i] = cur;         }         for(i = 0; i < switNum; i++)         {  cin>>f>>t;  if(f == t)   {      switNum--;      i--;      continue;  }  controlN cur = {f - 1, t - 1};  control[i] = cur;         }         cout<<"Villa #"<<caseN<<endl;         sort(control, control + switNum, compare);         if (!solve()) cout<<"The problem cannot be solved."<<endl;         cout<<endl;     }     return 0; }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/367006.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号