codeforce gym/100495/problem/F Snake++——DFS应用
emmmm....
在被新生暴打后,我花了很久才补出这道DFS。由于WA1检查了半天,最后竟然是输出少了一个: ,心态小崩。
这里普通的dfs算出的连通区域并不能直接当做最后的答案。所以需要类似模拟的DFS来处理。
代码如下:
#include<iostream>
using namespace std;
int q[12][12];//用数组标记该位置是空地、食物、还是障碍。
int pd[12][12];//判断有没有走过
int maxx=0;//记录最大路径长度
int a,b,mb;//a,b记录起始坐标,mb记录目标长度
void dfs(int x,int y,int s)
{
if(s>maxx) maxx=s;
if(q[(x+a-1)%a][y]&&!pd[(x+a-1)%a][y])
{
pd[(x+a-1)%a][y]=1;
if(q[(x+a-1)%a][y]==1) dfs((x+a-1)%a,y,s+1);
else if(q[(x+a-1)%a][y]==2)dfs((x+a-1)%a,y,s);
pd[(x+a-1)%a][y]=0;
}
if(q[(x+a+1)%a][y]&&!pd[(x+a+1)%a][y])
{
pd[(x+a+1)%a][y]=1;
if(q[(x+a+1)%a][y]==1) dfs((x+a+1)%a,y,s+1);
else if(q[(x+a+1)%a][y]==2) dfs((x+a+1)%a,y,s);
pd[(x+a+1)%a][y]=0;
}
if(q[x][(y+b-1)%b]&&!pd[x][(y+b-1)%b])
{
pd[x][(y+b-1)%b]=1;
if(q[x][(y+b-1)%b]==1) dfs(x,(y+b-1)%b,s+1);
else if(q[x][(y+b-1)%b]==2) dfs(x,(y+b-1)%b,s);
pd[x][(y+b-1)%b]=0;
}
if(q[x][(y+b+1)%b]&&!pd[x][(y+b+1)%b])
{
pd[x][(y+b+1)%b]=1;
if(q[x][(y+b+1)%b]==1) dfs(x,(y+b+1)%b,s+1);
else if(q[x][(y+b+1)%b]==2) dfs(x,(y+b+1)%b,s);
pd[x][(y+b+1)%b]=0;
}
}
int main()
{
int i,r,l,s,t,xx,yy,j;
char k;
cin>>t;
l=1;
while(t--)
{
maxx=0;
cin>>a>>b>>mb;
for(i=0;i<a;i++)
{
for(j=0;j<b;j++)
{
cin>>k;
if(k=='#') q[i][j]=0;
else if(k=='o') q[i][j]=2;
else if(k=='.') q[i][j]=1;
else if(k=='x')
{
xx=i;yy=j;q[xx][yy]=0;
}
pd[i][j]=0;
}
}
dfs(xx,yy,0);
if(maxx>=mb-1) cout<<"Case #"<<l++<<": Fits perfectly!"<<endl;
else cout<<"Case #"<<l++<<": Oh no, snake's too fat!"<<endl;
//cout<<maxx<<endl;
}
}
其中、比较值得注意的地方有两个。一个是蛇的“空间传送”。如何处理从a[0][k]到a[long-1][k]位置的行动。另一个是最后的比较,因为他要求全部出洞。而最后判断成功时尾巴一定是在洞口。所以可以直接把出生位置看成一个障碍(但是仍然从这里开始dfs),把长度-1. 还要注意,走到食物上时,长度会增加1,可以等效成“位置变化,长度不变”,来继续讨论。(因为如果改变全局变量mb的值,就会对dfs产生影响)
codeforce gym/100495/problem/F Snake++——DFS应用的更多相关文章
- codeforce gym/100495/problem/K—Wolf and sheep 两圆求相交面积 与 gym/100495/problem/E—Simple sequence思路简述
之前几乎没写过什么这种几何的计算题.在众多大佬的博客下终于记起来了当时的公式.嘚赶快补计算几何和概率论的坑了... 这题的要求,在对两圆相交的板子略做修改后,很容易实现.这里直接给出代码.重点的部分有 ...
- Codeforces Gym 100500F Problem F. Door Lock 二分
Problem F. Door LockTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100500/at ...
- Codeforces Gym 100002 Problem F "Folding" 区间DP
Problem F "Folding" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/ ...
- Codeforces Gym 100286F Problem F. Fibonacci System 数位DP
Problem F. Fibonacci SystemTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudg ...
- codeforces Gym 100187J J. Deck Shuffling dfs
J. Deck Shuffling Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...
- 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem F. Judging Time Prediction 优先队列
Problem F. Judging Time Prediction 题目连接: http://www.codeforces.com/gym/100253 Description It is not ...
- 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem F. Finance 模拟题
Problem F. Finance 题目连接: http://codeforces.com/gym/100714 Description The Big Boss Company (BBC) pri ...
- Gym - 100187J J - Deck Shuffling —— dfs
题目链接:http://codeforces.com/gym/100187/problem/J 题目链接:问通过洗牌器,能否将编号为x的牌子转移到第一个位置? 根据 洗牌器,我们可以知道原本在第i位置 ...
- 广东工业大学2016校赛决赛-网络赛 1174 Problem F 我是好人4 容斥
Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...
随机推荐
- io 流概念
io 流概念 对输入输出抽象的封装
- C# 声明隐式类型的局部变量
在c#中赋值给变量的值必须具有和变量相同的类型.如int值赋给int变量,c#编译器可以迅速判断变量初始化表达式的类型,如果变量类型不符,就会明确告诉你. 提示需要强制转换(例如在char中不允许使用 ...
- 创建一个简单的WCF程序2——手动开启/关闭WCF服务与动态调用WCF地址
一.创建WCF服务器 1.创建WCF服务器的窗体应用程序 打开VS2010,选择文件→新建→项目菜单项,在打开的新建项目对话框中,依次选择Visual C#→Windows→Windows窗体应用程序 ...
- 随笔 js-----------------------------------------------------------------------------------------------------
http://www.cnblogs.com/liuling/p/2014-4-19-04.html redis Base64.encode($( "#byerName").v ...
- 记账本微信小程序开发三
一.制作登陆界面: 更改全局配置,改颜色,名称: 界面 格式 登录界面 二.页面的跳转 按钮的设置 注册事件 结果
- 将表单序列化为JSON对象
将表单序列化为JSON对象的工具方法: $(function() { //工具方法,可以将指定的表单中的输入项目序列化为JSON数据 $.fn.serializeJson = function() { ...
- 建议使用nginx配合uwsgi,
试试gunicorn+supervisor+nginx. gunicorn是Python实现的的Web server,配置也比较简单. supervisor也是Python实现的,它用于进程管理. 这 ...
- js DOM常见事件
js事件命名为on+动词 1.onclick事件,点击鼠标时触发,ondbclick双击事件 <h1 onclick="this.innerHTML='点击后文本'"> ...
- rocketmq消息重复推送的问题
最近,在公司的测试环境,遇到个问题,每次重启应用重启后,原来消费过的消息又被重复推送了一遍,消费者和生产者代码如下: package com.tf56.queue.client; import jav ...
- windows下常用linux对应工具
tail 可从http://files.cnblogs.com/hantianwei/tail.zip下载,解压后exe,如下: e:\>tail -fn 300 tool-slow.logus ...