HDU 1072 Nightmare
来源:互联网 发布:mac install ipython 编辑:程序博客网 时间:2024/06/03 18:47
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072
题意:
给一个矩阵,从2走到3,倒计时从6开始,看是否在倒计时结束前到达3,输出最小步数。
规则:1可以走,0不可以走,遇到4,计数器重置为6。
思路:这道题目看似不难,我却做了好久,用的方法是DFS记忆化搜索,刚开始做只考虑了当走过的点的时间小于当前时间时,这个点就可以重复走,Wrong了几次,后来才考虑到需要满足两个条件时,走过的点才可以重复走:1、之前走过该点的时间小于当前时间 ;2、之前走过该点的步数大于当前步数(如果该点步数小于当前步数,再重复更新它的步数也没有意义,还会影响最后的结果)。。
#include <iostream>using namespace std;#define N 10int m,n,min_time;struct Node{int time;//记录到达该点的时间int vlue;//记录该点的值int step;//记录到达该点的步数}mp[N][N];void DFS(int x,int y,int step,int s){if(x<1||y<1||x>n||y>m||s<=0||mp[x][y].vlue==0||step>=min_time)return;if(mp[x][y].vlue==3){min_time=min(min_time,step);return;}if(mp[x][y].vlue==4)s=6;if(mp[x][y].time>=s&&mp[x][y].step<=step)//关键代码,优化return;mp[x][y].time=s;//更新该点的数据mp[x][y].step=step;DFS(x+1,y,step+1,s-1);DFS(x-1,y,step+1,s-1);DFS(x,y+1,step+1,s-1);DFS(x,y-1,step+1,s-1);}int main(){int T,x1,y1;cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>mp[i][j].vlue;mp[i][j].time=-1;mp[i][j].step=INT_MAX-3;if(mp[i][j].vlue==2)x1=i,y1=j;}min_time=INT_MAX;DFS(x1,y1,0,6);if (min_time != INT_MAX)cout << min_time << endl;elsecout << "-1" << endl;}return 0;}
阅读全文
0 0
- HDU 1072 Nightmare
- BFS hdu 1072 Nightmare
- HDU 1072 Nightmare BFS
- HDU 1072 Nightmare
- hdu 1072 Nightmare BFS
- hdu Nightmare 1072
- Hdu 1072 - Nightmare
- hdu 1072 Nightmare bfs
- HDU-1072:Nightmare
- hdu 1072 Nightmare
- HDU 1072 Nightmare
- HDU-1072-Nightmare
- hdu 1072 Nightmare
- HDU 1072 Nightmare
- Nightmare hdu 1072
- hdu 1072 Nightmare
- hdu 1072 Nightmare
- HDU 1072 Nightmare(搜索)
- 走格子-51Nod-1344
- 综述
- 如何在项目中上传文件
- mysql常用操作汇总(五)
- 如何使用Moco模拟HTTP网络接口
- HDU 1072 Nightmare
- Java 基础(一)
- div#sidebar{}与#sidebar div{}的区别
- lowbit
- mysql恢复之delete 忘加where条件误删除恢复(binglog格式必须是ROW)
- 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并
- Day2
- 大理石在哪儿 (排序和查找) UVA
- centOS6.8升级gcc