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;
}
#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;
}
相关文章推荐
- hdu4845 状态压缩搜索水题
- hdu 2291 Five in a Row, Again 状态压缩搜索
- 最大联通子数组之和(dfs,记忆化搜索,状态压缩)
- POJ_3420_Quad Tiling_搜索,矩阵快速幂,状态压缩,动态规划
- hdu1429 胜利大逃亡(续)(广搜+状态压缩)
- hdu4634 搜索+状态压缩
- poj 1753状态压缩水题一发
- ZOJ 3675 Trim the Nails(bfs+状态压缩搜索)
- hdu2167Pebbles dp+状态压缩水题
- 状态压缩 DP | 搜索
- UVA - 1252 Twenty Questions 记忆化搜索 状态压缩
- HDU1429 胜利大逃亡(续)(bfs+状态压缩)
- HDU 4536 XCOM Enemy Unknown ( 状态压缩+搜索)
- HDU1429 胜利大逃亡(续)(状态压缩+广搜BFS )
- hihocoder1233 搜索+状态压缩 我是菜比
- codeforces 424E Colored Jenga (状态压缩,概率dp用hash记忆优化搜索)
- hdu1429 胜利大逃亡(续) (BFS+简单状态压缩)
- uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)
- hdu1429(bfs+状态压缩)
- HDU1429 胜利大逃亡(续)(BFS+状态压缩)