http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2718&cid=1203

题意:给你一个m乘n的格子阵,从一边进去,直线往前走,如果前边有石头就往右走,如果右边还有石头就往左走,如果左边还有石头就忘回走,会给你一个起始点的坐标,当然是在4条边上,但是不会在角上,问你在哪个格子走出去,且走了多少步。

思路:DFS。好吧,当时做的时候卡在这儿,一直没D出来。。。。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int map[maxn][maxn]; int step=,n,m;
void dfs(int x,int y,int flag)
{
if(flag == )//右
{
bool flag1 = false;
for(int i = x ; i <= n ; i++)
{
if(map[i][y])//一直走直到前边是石头为止
{
flag1 = true ;
step += (i-x-);//把前边走过的都加上但要减去当前占的这个格子,所以减1
if(!map[i-][y-])//如果右边没有石头向右转
{
dfs(i-,y,);//右的右边是下
break;//结束掉每一次的循环,因为有石头之后循环就不应该进行了
}
else if(map[i-][y-]&&!map[i-][y+])//向上
{
dfs(i-,y,);
break;
}
else if(map[i-][y-]&&map[i-][y+])//回去
{
dfs(i-,y,);
break;
}
}
}
if(!flag1)
{
step += (n-x);
printf("%d %d %d\n",n,y,step);
return;
}
}
else if(flag == )//上
{
bool flag2=false;
for(int i = y ; i <= m ; i++)
{
if(map[x][i])
{
flag2 = true ;
step += (i-y-) ;
if(!map[x+][i-])
{
dfs(x,i-,);
break;
}
else if(map[x+][i-]&&!map[x-][i-])
{
dfs(x,i-,);
break;
}
else if(map[x+][i-]&&map[x-][i-])
{
dfs(x,i-,);
break;
}
}
}
if(!flag2)
{
step += (m-y);
printf("%d %d %d\n",x,m,step);
}
}
else if(flag == )//左
{
bool flag3 = false;
for(int i = x ; i >= ; i--)
{
if(map[i][y])
{
flag3 = true ;
step += (x-i-);
if(!map[i+][y+])
{
dfs(i+,y,);
break;
}
else if(map[i+][y+]&&!map[i+][y-])
{
dfs(i+,y,);
break;
}
else if(map[i+][y+]&&map[i+][y-])
{
dfs(i+,y,);
break;
}
}
}
if(!flag3)
{
step += x-;
printf("%d %d %d\n",,y,step);
}
}
else if(flag == )//下
{
bool flag4 = false;
for(int i = y ; i >= ; i--)
{
if(map[x][i])
{
flag4 = true;
step += (y-i-);
if(!map[x-][i+])
{
dfs(x,i+,);
break;
}
else if(map[x-][i+]&&!map[x+][i+])
{
dfs(x,i+,);
break;
}
else if(map[x-][i+]&&map[x+][i+])
{
dfs(x,i+,);
break;
}
}
}
if(!flag4)
{
step += y-;
printf("%d %d %d\n",x,,step);
}
}
} int main()
{
int k,sx,sy;
int cnt = ;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
if(n==&&m==&&k==) break;
step = ;//初始格子算一步
memset(map,,sizeof(map));
for(int i = ; i < k ; i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y] = ;//将这些点标记为1代表不能走
}
int flag;
scanf("%d %d",&sx,&sy);
if(sx == ) flag = ;//右
else if(sy == ) flag = ;//上
else if(sy == m) flag = ;//下
else if(sx == n) flag = ;//左
printf("Case %d: ",cnt);
cnt++;
dfs(sx,sy,flag);
}
return ;
}

中国海洋大学第四届朗讯杯高级组 A Rocky的更多相关文章

  1. 中国海洋大学第四届朗讯杯高级组 I Cuckoo for Hashing

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2719&cid=1203 题意 :意思就是哈希来的,具体大意就是说有两个哈希表,然后有这样 ...

  2. 中国海洋大学第四届朗讯杯高级组 Cash Cow(模拟)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2721 题意: 给定n个左标,跟那n个坐标 ...

  3. 中国海洋大学第四届朗讯杯高级组 A 2718 Rocky(模拟)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2718 题意:优先直走,右 左 后.... ...

  4. 腾讯云 安全组配置及与MySQL 远程登录失败原因浅析

    前言,知道自己腾讯云服务器安全组配置并在安全组里开放了所有端口的用户可以粗略的看看下边的内容,否则就仔细看看吧. 因为有学习及业务需要,我要在腾讯云上安装了CentOS7.2版本的服务器上安装MySQ ...

  5. 第四届蓝桥杯C++B组省赛

    1.高斯日记 2.马虎的算式 3.第39级台阶 4.黄金连分数 5.前缀判断 6.三部排序 7.错误票据 8.翻硬币 9.带分数 10.连号区间数

  6. 第四届蓝桥杯C++B组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.猜灯谜 A 村的元宵节灯会上有一迷题: 请猜谜 * 请猜谜 = 请边赏灯边猜 小明想,一定是每个汉字代表一个数字,不同的汉字代表不同的 ...

  7. CF 3-6 2级组 D题 STRESSFUL TRAINING 紧张的比赛

    题目大概是这样的: 给出一个数列a[n] ,对于每一个数 a [i] 来说 都会在 T - - 时 -= b[i] 每个数都在任何时刻不能小于0 你可以在每次T - - 之前时给 一 个 a[i] + ...

  8. [2020年10月28日普级组]1405.小B浇花

    区 间 和 的 和 区间和的和 区间和的和 题目解析 就直接模拟,从最低的花的高度向最高的花的高度枚举,如果当循环变量的值到达了顶峰,但还有花的数量大于2的,就把循环上线加一(所以数组要开大些) Co ...

  9. [2020年10月28日普级组]1406.SMRTFUN

    S M R T F U N SMRTFUN SMRTFUN 题目描述 "又肥又温顺,又大又笨,他们看起来那么傻,而且也不有趣--" 这些牛想要证明,他们是既有趣,又聪明的.为了这样 ...

随机推荐

  1. 使用Keil建立工程和烧录到89C52板上

    又开始学习C51了,不清楚能坚持多久,之前学过一段时间,学完P1口就没再学了,之前学的都忘了. 1. 使用Keil 进行建立工程:打开Keil 4. 加载C文件进工程里面 然后展开"Sour ...

  2. ASP实现https和http之间转化

    HTTPS 是一个安全通信信道,用于在客户计算机和服务器之间交换信息.它使用安全套接字层 (SSL). HTTPS (Secure Hypertext Transfer Protocol) 安全超文本 ...

  3. C#学习笔记6:各种字符串问题

    1.字符串 逐字字符串字面量:字符串前加@,不仅将反斜杠当做普通字符来处理,而且还会逐字解释所有空白字符. 如: Class Triangle { Static void Main() { Syste ...

  4. Cordova+angularjs+ionic+vs2015开发(五)

    欢迎加群学习:457351423 这里有4000多部学习视频,涵盖各种技术,有需要的欢迎进群学习! 一.创建侧边菜单和导航项目 1.使用VS创建一个Ionic空项目,同时创建一个Ionic SideM ...

  5. effective c++(07)之为多态基类声明virtual析构函数

    class TimeKeeper { public: TimeKeeper() ; ~TimeKepper() ; ... } ; class AtomicClock:public TimeKeepe ...

  6. 一步一步搭建 OAuth 认证服务器

    http://www.fising.cn/2011/03/%E4%B8%80%E6%AD%A5%E4%B8%80%E6%AD%A5%E6%90%AD%E5%BB%BA-oauth-%E8%AE%A4% ...

  7. Object-C中的内存管理小记

    //错解1:内存泄露 - (void)setObj:(Object *)newObj { obj = [newObj retain]; } 当新旧对象指向不同时,执行这段代码后,obj会指向另一个对象 ...

  8. CSS3的几个标签速记3

    transition:CSS3过渡     css3里很好的一个标签,可以非常方便的完成需要很多JS才能完成的动态效果 例语法:transition:width 2S,height 2S,transf ...

  9. Oracle PL/SQL 找出100以内是3和5的倍数的数 循环语句

    循环: loop --执行代码 exit when 表达式;--当表达式为真退出循环.(注意,其编写位置决定循环为先判断还是先执行,相当于java的while或do-while) end loop; ...

  10. attempt to write a readonly database 的解决办法

    这个问题导致我的unity项目崩溃,以至于无法打开. 第一次出现这个问题是因为在Lighting窗口中build按钮下点击了clear all baked datas,导致unity强制退出,并给出上 ...