hoj2706 key task

http://acm.hit.edu.cn/hoj/problem/view?id=2706

广搜,利用变量key来记录钥匙的种类,15代表有四把钥匙,0代表没有钥匙。此题特别的地方在于同一位置可能重复入队列,因为其拥有的钥匙会不同,所以用data[y][x][key]key代表其

的钥匙状态。

/*This Code is Submitted by billforum for Problem 2706 at 2012-01-29 19:39:56*/
#include <iostream>
#include <queue>

using namespace std;
int H,W;

struct point{
int x,y;
char c;
int step;
int key;
bool f;
};

point data[105][105][16];


int main(int args,char** argv)
{
char ch;
int sx,sy,ans,flag,t;
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
while(cin>>H>>W&&H&&W)
{
ans=0;
flag=0;
for(int i=0;i<H;i++)
for(int j=0;j<W;j++)
{
cin>>ch;

for(int f=0;f<16;f++)
{

data[i][j][f].x=j;
data[i][j][f].y=i;
data[i][j][f].step=0;
data[i][j][f].c=ch;
data[i][j][f].key=f;
data[i][j][f].f=0;
if(ch=='*')
{
sx=j;
sy=i;
}
}
}
queue<point> list;
data[sy][sx][0].f=1;
list.push(data[sy][sx][0]);
while(!list.empty())
{
point tmp=list.front();
if(tmp.c=='X')
{
flag=1;
ans=tmp.step;
break;
}
for(int i=0;i<4;i++)
{
if(tmp.x+dx[i]>=0&&tmp.x+dx[i]<W&&tmp.y+dy[i]>=0&&tmp.y+dy[i]<H)
{
int tx=tmp.x+dx[i];
int ty=tmp.y+dy[i];
int key=tmp.key;
if(data[ty][tx][key].c=='#') continue;
if(data[ty][tx][key].c=='.'||data[ty][tx][key].c=='*'||data[ty][tx][key].c=='X')
{
if(data[ty][tx][key].f==0)
{
data[ty][tx][key].f=1;
data[ty][tx][key].step=tmp.step+1;
list.push(data[ty][tx][key]);
}
continue;
}
//此处写得比较繁琐,这段代码的功能是用于检测字符Y R G B,y r g b;
if(data[ty][tx][key].c=='Y')
{
if((data[ty][tx][key].key&8)!=0)
{
if(data[ty][tx][key].f==0)
{
data[ty][tx][key].f=1;
data[ty][tx][key].step=tmp.step+1;
list.push(data[ty][tx][key]);
}
continue;
}
continue;
}
if(data[ty][tx][key].c=='R')
{
if((data[ty][tx][key].key&4)!=0)
{
if(data[ty][tx][key].f==0)
{
data[ty][tx][key].f=1;
data[ty][tx][key].step=tmp.step+1;
list.push(data[ty][tx][key]);
}
continue;
}
continue;
}
if(data[ty][tx][key].c=='G')
{
if((data[ty][tx][key].key&2)!=0)
{
if(data[ty][tx][key].f==0)
{
data[ty][tx][key].f=1;
data[ty][tx][key].step=tmp.step+1;
list.push(data[ty][tx][key]);
}
continue;
}
continue;
}
if(data[ty][tx][key].c=='B')
{
if((data[ty][tx][key].key&1)!=0)
{
if(data[ty][tx][key].f==0)
{
data[ty][tx][key].f=1;
data[ty][tx][key].step=tmp.step+1;
list.push(data[ty][tx][key]);
}
continue;
}
continue;
}
if(data[ty][tx][key].c=='y')
{
int kk=data[ty][tx][key].key|8;
if(data[ty][tx][kk].f==0)
{
data[ty][tx][kk].f=1;
data[ty][tx][kk].step=tmp.step+1;
list.push(data[ty][tx][kk]);
}
continue;
}
if(data[ty][tx][key].c=='r')
{
int kk=data[ty][tx][key].key|4;
if(data[ty][tx][kk].f==0)
{
data[ty][tx][kk].f=1;
data[ty][tx][kk].step=tmp.step+1;
list.push(data[ty][tx][kk]);
}
continue;
}
if(data[ty][tx][key].c=='g')
{
int kk=data[ty][tx][key].key|2;
if(data[ty][tx][kk].f==0)
{
data[ty][tx][kk].f=1;
data[ty][tx][kk].step=tmp.step+1;
list.push(data[ty][tx][kk]);
}
continue;
}
if(data[ty][tx][key].c=='b')
{
int kk=data[ty][tx][key].key|1;
if(data[ty][tx][kk].f==0)
{
data[ty][tx][kk].f=1;
data[ty][tx][kk].step=tmp.step+1;
list.push(data[ty][tx][kk]);
}
continue;
}
}
}
list.pop();

}
if(flag==1)
cout<<"Escape possible in "<<ans<<" steps."<<endl;
else cout<<"The poor student is trapped!"<<endl;
}

return 0;
}



转载于:https://www.cnblogs.com/wuzhibin/archive/2012/01/30/2331798.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值