您的位置:首页 > 其它

HDU 1072 Nightmare(搜索)

2013-08-03 09:51 302 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072

      这是一个很简单的一个搜索题目,数据量很小,基本上如果不陷入死循环就不会超时,我犯了个小错误,rec在每次加过之后没有恢复,一度错我,半小时内没发现

导致一直调试不通过!

      这个其实就是一道普通的BFS,用lock数组记录到当前节点还剩下的时间,如果下次又到达这里但是剩下的时间比上次来的时候少,那么就不用来了,人家时间多的

都还没到,你时间少的还过来,其次就是一些常识性减枝,完成一些更新,就ok了,看AC比率基本上都是1Y了

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
int map[100][100];
int n,m;
int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}};
struct point
{
int have;
int time;
int i,j;
};
int lock[100][100];
int find_ans(int i,int j)
{

queue<point>q;
int ans=99999;
point temp,rec;
temp.have=6,temp.time=0,temp.i=i,temp.j=j;
q.push(temp);
while(!q.empty())
{
temp=q.front();
rec=temp;
// printf("%d %d\n",rec.i,rec.j);
q.pop();
if(rec.time >=ans || rec.have<=0)
continue;
if(map[rec.i][rec.j]==3)
{
ans=rec.time;
continue;
}
if(map[rec.i][rec.j]==4)
{

temp.have=6;
rec.have=6;
}
for(i=0;i<4;i++)
{
rec=temp;
if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]!=0)
{
//printf("temp: %d %d\n",temp.i+dir[i][0],temp.j+dir[i][1]);
rec.i+=dir[i][0],rec.j+=dir[i][1];
rec.have--;
rec.time++;
//printf("I:%d %d %d\n",i,rec.i,rec.j);
if(lock[temp.i+dir[i][0]][temp.j+dir[i][1]] < rec.have)
{
// printf("h:%d\n",rec.have);
q.push(rec);
lock[temp.i+dir[i][0]][temp.j+dir[i][1]]=rec.have;
}
}
}
}
if(ans==99999)
printf("%d\n",-1);
else
printf("%d\n",ans);
return 0;
}
int main()
{
int t,i,j,k,a,b;
scanf("%d",&t);
while(t--)
{
memset(map,0,sizeof(map));
for(i=0;i<100;i++)
for(j=0;j<100;j++)
lock[i][j]=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
a=i,b=j;
}
find_ans(a,b);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 搜索