cogs 1755. 爱上捉迷藏
1755. 爱上捉迷藏
☆ 输入文件:kadun.in
输出文件:kadun.out
简单对比
时间限制:0.001 s 内存限制:2 MB
【背景】
乃们都玩过赛尔号吧……,那有木有玩过赛尔号2呢?(众人:你TM都多大了……)
(⊙o⊙)…,多大怎么了,哥一直怀着一颗永不泯灭的童心~
【问题描述】
众所周知(呃,没玩过的除外),卡顿啾啾是赛尔号2里的一个普通系精灵,其未进化体名叫啾啾,进化后体型肥胖,励志减肥。历经磨难终于摆脱肥胖的困扰,前后变化实在让人难以想象。咳咳,这不是问题的重点……(众人:-_-#)
(从众人乱拳中挤了出来)好吧,开始今天的重点。啾啾是个很调皮的精灵,它特别喜欢玩捉迷藏,本题即是由赛尔号2中爱上捉迷藏这一小游戏改编而来。通关小游戏就可以……(瞥了一眼青筋暴起的一群禽兽…)呃,不要那么暴力好不好~TAT
啾啾藏在了一个m*n的矩阵中,这个矩阵有m*n个格子,啾啾就在其中之一。这种格子采用特殊材料制成,外表透明,藏在其中用眼睛根本无法看到什么变化。但是这毕竟是赛尔号的科技,所以小赛尔只要把手在格子上轻轻敲击就会得到回复,我们记为该格子的状态。其中若返回为X,则该点可能啾啾藏身的格子,但也有可能是距离啾啾很远的格子;若返回为N,则啾啾就在以该点为中心的7*7的矩阵中的某个格子;若返回为C, 则啾啾就在以该点为中心的5*5的矩阵中的某个格子;若返回为Z;则啾啾就在以该点为中心的3*3的矩阵中的某个格子。
现在某个小赛尔为了快速通关而获得奖励,使用了外挂,从而获得了每个格子的返回值,但是看着眼花缭乱的字母,却无从下手,于是便找到了你(至于怎么找到的,为了我的生命安全,我还是不说了),请你编写程序帮助他找到啾啾所在的格子。(众人:这种水题还好意思说这么长时间!)啊!!!!!!(惨叫声)
【输入数据格式】
第一行两个数n,m,表示一个m*n的矩阵;
第二行到第m−1行每行一个长度为n的字符串,表示矩阵状态。
【输出数据格式】
一行两个数,分别为啾啾藏身的格子的列数和行数。
【输入样例】
6 4
ZZZCNX
ZXZCNX
ZZZCNX
CCCCNX
【输出样例】
2 2
【数据范围及约定】
20%的数据:1≤n,m≤5;
60%的数据:1≤n,m≤70;
100%的数据:1≤n,m≤100;
【Hite】
真的真的很水。
思路:暴力搜索。
跑的慢的
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,num; struct nond{ int x,y,flag; }v[11010]; int map[110][110]; int main(){ freopen("kadun.in","r",stdin); freopen("kadun.out","w",stdout); scanf("%d%d",&m,&n); for(int i=1;i<=n;i++){ char s[110]; scanf("%s",s+1); for(int j=1;j<=m;j++){ if(s[j]=='X'){ v[++num].x=i; v[num].y=j; } else if(s[j]=='N') map[i][j]=3; else if(s[j]=='C') map[i][j]=2; else if(s[j]=='Z') map[i][j]=1; } } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(map[i][j]!=0) for(int k=1;k<=num;k++) if(v[k].flag||v[k].x<i-map[i][j]||v[k].x>i+map[i][j]||v[k].y<j-map[i][j]||v[k].y>j+map[i][j]) v[k].flag=1; for(int i=1;i<=num;i++) if(!v[i].flag){ cout<<v[i].y<<" "<<v[i].x; break; } }
跑的快的
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int m,n; char s[110][110]; int main(){ freopen("kadun.in","r",stdin); freopen("kadun.out","w",stdout); scanf("%d%d",&m,&n); for(int i=0;i<n;i++) scanf("%s",s[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(s[i][j]=='X'&&(s[i+1][j]=='Z'&&s[i][j+1]=='Z'||s[i-1][j]=='Z'&&s[i][j-1]=='Z')){ printf("%d %d",j+1,i+1); return 0; } return 0; }