您的位置:首页 > 其它

hdu1429 状态压缩搜索水题

2014-09-22 18:53 411 查看
简单状态压缩    最多有10把钥匙    2^10=1024   开一个三维数组记录每个位置的状态

#include<stdio.h>

#include<iostream>

#include<queue>

#include<string.h>

using namespace std;

struct node

{
int x;
int y;
int step;
int key;//记录状态

}a,b;

int mark[30][30][1500];

char map[30][30];

int n,m,k;

int dir[4][2]={0,1,0,-1,1,0,-1,0};

int bfs(int starx,int stary)

{
a.x=starx;
a.y=stary;
a.step=0;
a.key=0;
memset(mark,0,sizeof(mark));
mark[a.x][a.y][0]=1;
queue<node>q;
q.push(a);
while(!q.empty())
{
b=q.front();
q.pop();
if(b.step>=k) break;
if(map[b.x][b.y]=='^')
{
printf("%d\n",b.step);
return 1;
}
for(int i=0;i<4;i++)
{
a.x=b.x+dir[i][0];
a.y=b.y+dir[i][1];
a.step=b.step+1;
a.key=b.key;
if(a.x<0||a.x>=n||a.y<0||a.y>=m) continue;
if(map[a.x][a.y]=='*') continue;
if(mark[a.x][a.y][a.key]) continue;
if(map[a.x][a.y]>='a'&&map[a.x][a.y]<='j')
{
a.key=a.key|(1<<(map[a.x][a.y]-'a'));//或运算的简单运用   听说省时间
mark[a.x][a.y][a.key]=1;
q.push(a);

}
else if(map[a.x][a.y]>='A'&&map[a.x][a.y]<='J')
{
if(a.key&(1<<map[a.x][a.y]-'A'))
{
mark[a.x][a.y][a.key]=1;
q.push(a);
}
}
else
{
mark[a.x][a.y][a.key]=1;
q.push(a);
}
}
}
return 0;

}

int main()

{
int i,j;
while(~scanf("%d%d%d",&n,&m,&k))
{
for(i=0;i<n;i++)
scanf("%s",map[i]);
int starx,stary,endx,endy;
int flash=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]=='@')
{
starx=i;
stary=j;
flash=1;
break;
}
}
if(flash) break;
}
flash=bfs(starx,stary);
if(!flash) printf("-1\n");
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  压缩 搜索