前年的省赛题,难点在于这个石头的推移不太好处理

后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可。先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找的点,然后dfs每次探索新区域的新点即可,想通了这里很好做了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char mat[][];
int vis[][];
int rock[][],cnt;
int n,m;
int dir[][]={{,},{-,},{,},{,-}};
int inq[];
int res,sum;
void dfs1(int sx,int sy,int col)
{
vis[sx][sy]=col;
for (int i=;i<;i++){
int nx=sx+dir[i][];
int ny=sy+dir[i][];
if (nx< || nx>=n || ny< || ny>=m) continue;
if (vis[nx][ny]) continue;
if (mat[nx][ny]=='O'|| mat[nx][ny]=='X') continue; if(mat[nx][ny]=='C'){
res++;
}
dfs1(nx,ny,col);
}
}
void back(int x,int y,int col)
{
vis[x][y]=;
for (int i=;i<;i++){
int nx=x+dir[i][];
int ny=y+dir[i][];
if (nx< || ny< || nx>=n || ny>=m) continue;
if (vis[nx][ny]!=col) continue;
back(nx,ny,col);
} }
int maxn,ans;
void proc(int num)
{
char cc;
if (num>=cnt) return;
for (int i=;i<cnt;i++){
if (inq[i]) continue;
inq[i]=;
int x=rock[i][];
int y=rock[i][];
for (int j=;j<;j++){
int dx=x+dir[j][];
int dy=y+dir[j][];
if (dx< || dx>=n || dy< || dy>=m) continue;
if (mat[dx][dy]=='X') continue;
if (!vis[dx][dy]) continue;
int tx=x-dir[j][];
int ty=y-dir[j][];
if (tx< || tx>=n || ty< || ty>=m) continue;
if (mat[tx][ty]!='.' && !vis[tx][ty]) continue;
cc=mat[tx][ty];
mat[tx][ty]='O';
mat[x][y]='.';
res=;
dfs1(x,y,i+);
maxn+=res;
int tmp=res;
ans=max(ans,maxn);
proc(num+);
back(x,y,i+);
maxn-=tmp;
mat[tx][ty]=cc;
mat[x][y]='O';
}
proc(num+);
inq[i]=;
} }
int main()
{
int t,sx,sy;
scanf("%d",&t);
while (t--)
{
cnt=;
scanf("%d%d",&n,&m);
for (int i=;i<n;i++){
scanf("%s",mat[i]);
for (int j=;j<m;j++){
vis[i][j]=;
if (mat[i][j]=='S'){
sx=i;sy=j;mat[i][j]='.';
}
else
if (mat[i][j]=='O'){
rock[cnt][]=i;
rock[cnt++][]=j;
}
}
}
res=;
dfs1(sx,sy,);
sum=res;
maxn=,ans=;
memset(inq,,sizeof inq);
proc();
ans+=sum;
printf("%d\n",ans);
}
return ;
}

UVA 12510/CSU 1119 Collecting Coins DFS的更多相关文章

  1. CSU 1119 Collecting Coins

    bfs+dfs 很复杂的搜索题. 因为数据很小,rock最多只有5个,coin最多只有10个,移动rock最多4^5=1024种状态: 思路: 每次先把当前状态能拿到的coin拿走,并将地图当前位置设 ...

  2. csuoj 1119: Collecting Coins

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1119 1119: Collecting Coins Time Limit: 3 Sec  Memo ...

  3. UVA.839 Not so Mobile ( 二叉树 DFS)

    UVA.839 Not so Mobile ( 二叉树 DFS) 题意分析 给出一份天平,判断天平是否平衡. 一开始使用的是保存每个节点,节点存储着两边的质量和距离,但是一直是Runtime erro ...

  4. UVa 12118 检查员的难题(dfs+欧拉回路)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  5. 开篇,UVA 755 && POJ 1002 487--3279 (Trie + DFS / sort)

    博客第一篇写在11月1号,果然die die die die die alone~ 一道不太难的题,白书里被放到排序这一节,半年前用快排A过一次,但是现在做的时候发现可以用字典树加深搜,于是乐呵呵的开 ...

  6. UVA - 524 Prime Ring Problem(dfs回溯法)

    UVA - 524 Prime Ring Problem Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & % ...

  7. UVA 572 Oil Deposits油田(DFS求连通块)

    UVA 572     DFS(floodfill)  用DFS求连通块 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format: ...

  8. Uva 167 The Sultan's Successors(dfs)

    题目链接:Uva 167 思路分析:八皇后问题,采用回溯法解决问题. 代码如下: #include <iostream> #include <string.h> using n ...

  9. UVA 539 The Settlers of Catan dfs找最长链

    题意:画边求最长链,边不能重复数点可以. 很水,用暴力的dfs即可,因为数据不大. 本来以为可以用floyd进行dp的,后来想想好像不能在有回路上的图跑...于是没去做. #include <c ...

随机推荐

  1. Netsparker介绍

    Netsparker是一款综合型的web应用安全漏洞扫描工具,它分为专业版和免费版,免费版的功能也比较强大.Netsparker与其他综合性的web应用安全扫描工具相比的一个特点是它能够更好的检测SQ ...

  2. cookie、 Session Storage 、 Local Storage

    问题描述: 使用Ajax, Controller 传回来 JSON 字符串(待处理的信息) 在 Ajax 中实现页面跳转 window.location.href="/jsp/index.j ...

  3. DateTime.Now.ToFileTime

    var s = System.DateTime.Now.ToFileTime().ToString(); DateTime.Now.ToFileTime() 可以获得当前时间的长整型数字,这个数字应该 ...

  4. mysql将一个表拆分成多个表(一)(转载)

    转载 直接根据数据量进行拆分 有一个5000条数据的表,要把它变成没1000条数据一个表的5等份. 假设:表名:xuesi 主键:kidxuesi共有5000条数据,kid从1到5000自动增长题目: ...

  5. Scrapy 下载文件和图片

    我们学习了从网页中爬取信息的方法,这只是爬虫最典型的一种应用,除此之外,下载文件也是实际应用中很常见的一种需求,例如使用爬虫爬取网站中的图片.视频.WORD文档.PDF文件.压缩包等. 1.Files ...

  6. Python 中的else

    在其他程序语言中,else 似乎只是与 if 关键字有缘分.而与其他的关键字没有联系,不能搭配使用,而在python中,else 除了与 if 匹配外, 还可以与for.while/ try等关键字匹 ...

  7. C#中File和FileStream的用法----转载

    C#中File和FileStream的用法原创 忆汐辰 发布于2019-04-10 11:34:23 阅读数 5841 收藏展开 在近期的工作过程中发现自己的基础比较薄弱,所以最近在恶补基础知识.下面 ...

  8. @Qualifier

    当一个接口,有多个实现类且均已注入到spring容器中了,使用时@AutoWired是byType的,而这些实现类类型都相同,此时就需要使用@Qualifier明确指定使用那个实现类.因此,@Qual ...

  9. lvextend 扩容后, df -h 看到的却还是原来的大小

    [root@stb ~]# df -hFilesystem                  Size  Used Avail Use% Mounted on/dev/mapper/vg_stb-lv ...

  10. 常用的HBase命令

    进入HBase shell:hbase shell 退出HBase shell:exit 查看HBase中所有的表:list 查看某个表中的记录总数:count 'table name' 查看某个表中 ...