hdu5040 (2014北京网赛1009) Instrusive

2024-01-28 06:38

本文主要是介绍hdu5040 (2014北京网赛1009) Instrusive,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        题意:n*n网格走迷宫。。迷宫中有障碍物不能走过去。迷宫中还有一些相机,人不能被相机照到。每个相机有朝向,照的距离是2(相机本身格子和朝向的下一个格子),每秒所有相机顺时针转90度。人走到相邻格子花1秒,并且有一个隐身技能,可以隐着身不走,如果要隐身走,则花3秒。具体规则是:如果当前格子被照到,必须隐身,如果将要走到的格子被照到,也必须隐身走过去。

        思路:状态空间搜索。开三维状态,一、二维是行、列,第三维是时间模4,因为相机的状态只有4种。无论什么情况,总是可以隐身走动或者隐身不走的。但是如果需要不隐身走,就需要进行稍微复杂的判断,我是开了10个bool变量。。。具体见代码。


#include <iostream>    
#include <stdio.h>    
#include <cmath>    
#include <algorithm>    
#include <iomanip>    
#include <cstdlib>    
#include <string>    
#include <memory.h>    
#include <vector>    
#include <queue>    
#include <stack>    
#include <map>  
#include <set>  
#include <ctype.h>    using namespace std;  char mp[510][510];
int dirn[]={-1,0,1,0};
int dirm[]={0,1,0,-1};int a[510][510][4];struct node{int n;int m;int dis;node(int a,int b,int c){n=a; m=b; dis=c;}bool operator<(node nb)const{return dis>nb.dis;}
};int main(){int t;cin>>t;int cas=0;while(t--){cas++;memset(a,-1,sizeof(a));int n;cin>>n;int startn,startm;int endn,endm;for(int i=1;i<=n;i++){scanf("%s",mp[i]+1);for(int j=1;j<=n;j++){if(mp[i][j]=='M'){startn=i; startm=j;}else if(mp[i][j]=='T'){endn=i; endm=j;}else if(mp[i][j]=='N'){mp[i][j]=0;}else if(mp[i][j]=='E'){mp[i][j]=1;}else if(mp[i][j]=='S'){mp[i][j]=2;}else if(mp[i][j]=='W'){mp[i][j]=3;}}}int ans=0;node start(startn,startm,1); a[startn][startm][1]=1;priority_queue<node> que; que.push(start);while(!que.empty()){node cur=que.top(); que.pop();int cn=cur.n;int cm=cur.m;int cdis=cur.dis;if(cn==endn&&cm==endm){ans=cdis;break;}for(int i=0;i<4;i++){int newn=cn+dirn[i];int newm=cm+dirm[i];if(newn>n||newn<1||newm>n||newm<1)continue;if(mp[newn][newm]=='#')continue;int statu=(cdis+3)%4;if(a[newn][newm][statu]==-1||cdis+3<a[newn][newm][statu]){a[newn][newm][statu]=cdis+3;node nd(newn,newm,cdis+3);que.push(nd);}//符合以下条件其中一种就不能花1秒来移动了,简直。。。 bool cs0=newn<n&& mp[newn+1][newm]<4 && ((mp[newn+1][newm]+cdis)%4)==1; //N相机 bool cs1=newm>1&& mp[newn][newm-1]<4 && ((mp[newn][newm-1]+cdis)%4)==2; //E相机bool cs2=newn>1&& mp[newn-1][newm]<4 && ((mp[newn-1][newm]+cdis)%4)==3; //S相机bool cs3=newm<n&& mp[newn][newm+1]<4 && ((mp[newn][newm+1]+cdis)%4)==0; //W相机bool cs4=cn<n&& mp[cn+1][cm]<4 && ((mp[cn+1][cm]+cdis)%4)==1; //N相机 bool cs5=cm>1&& mp[cn][cm-1]<4 && ((mp[cn][cm-1]+cdis)%4)==2; //E相机bool cs6=cn>1&& mp[cn-1][cm]<4 && ((mp[cn-1][cm]+cdis)%4)==3; //S相机bool cs7=cm<n&& mp[cn][cm+1]<4 && ((mp[cn][cm+1]+cdis)%4)==0; //W相机bool cs8=mp[newn][newm]>=0&&mp[newn][newm]<=3;  //走到相机上 bool cs9=mp[cn][cm]>=0&&mp[cn][cm]<=3;  //当前在相机上 if(cs0||cs1||cs2||cs3||cs4||cs5||cs6||cs7||cs8||cs9)continue;statu=(cdis+1)%4;if(a[newn][newm][statu]==-1||cdis+1<a[newn][newm][statu]){a[newn][newm][statu]=cdis+1;node nd(newn,newm,cdis+1);que.push(nd);}}if(a[cn][cm][(cdis+1)%4]==-1||cdis+1<a[cn][cm][(cdis+1)%4]){a[cn][cm][(cdis+1)%4]=cdis+1;node nd(cn,cm,cdis+1);que.push(nd);}}printf("Case #%d: %d\n",cas,ans-1);}return 0;
}


这篇关于hdu5040 (2014北京网赛1009) Instrusive的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652782

相关文章

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

2014年暑假培训 - 数论

A银河上的星星 /**************************************************************     Problem: 1014     User: DoubleQ     Language: C++     Result: Accepted     Time:190 ms     Memor

2014暑假集训搜索专题

A - 漫步校园 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Description LL最近沉迷于AC不能自拔,每天寝室、机房两点一线。由于长时间坐在电脑边,缺乏运动。他决定充分利用每次从寝室到机房的时间,在校园里散散步。整个HDU校园呈方形布局,可划

[置顶] 2014训练计划进阶版

动态规划: 区间dp,树状dp,数位dphdu3555, sgu258, sgu390  队列优化: zoj3399 最小表示法的状态压缩DP: spoj2159  专题链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38881#overview 专题链接: http://acm.hust.edu.cn/vjudg

[置顶] 2014训练计划

每个专题结束后会有5小时的专题赛~ 1、hustOJ目前支持谷歌、火狐浏览器等部分浏览器。 2、欢迎吐槽~ 3、推荐该阶段用书(以下具体算法实现多数可在此书中找到详解):算法竞赛入门经典之训练指南(刘汝佳) 4、题解报告:专题中的题目多是经典题目,百度搜索即有详细解答~ 5、专题相关知识点红字标出,建议先百度红字部分,有助于专题学习~ 6、专题时间会在"ACM 今天你AC了吗?"(12

2014级寒假特训之并查集专题

Problem A: Double和XXZ的生日宴请 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 9   Solved: 7 [ Submit][ Status][ Web Board] [ Edit] [ TestData] Description Double 和 XXZ同一天生日,他们俩30岁生日那天,当年

2014年ACM/ICPC亚洲区现场赛广州赛区总结

本来不想提这件事的,后来学姐找我谈心时提到这件事,我突然意识到在这件事情上我错了一次,明明答应的去参加这场比赛,最后临时决定不去......其实中间有很多很多原因 1:我和tyh,sxk临时不去主要是广州太远,我们身上money不够,呵呵。。。别笑我们,你以为我们是高富帅啊,去一趟广州消费要2个月的生活费,奖学金又没发,你让我找我妈要她辛辛苦苦挣来的工资吗?!从哈尔滨到广州单来回的火车票每个人就