bfs+dfs

很复杂的搜索题。

因为数据很小,rock最多只有5个,coin最多只有10个,移动rock最多4^5=1024种状态;

思路:

  每次先把当前状态能拿到的coin拿走,并将地图当前位置设为'.' (拿走coin的位置为空)

  拿走coin后,在搜索一次,碰到rock判断是否能push动,能的话建立一个新地图,rock所在点设为'.' (空),rock移动到的点设为'X' (只能移动一次)。就这样递归下去,因为只有5个rock,最对递归5层。

  每次扫描完当前状态地图和以前拿到的最大值比较一下,取较大值 (有时候不移动rock拿到的coin更多!)

ps:开始为了少设置一个变量偷懒,结果得不偿失,卡了好久。。。看来以后要小心点,不要随便改动前面的值,宁可多敲点也别犯这种低级错误。。。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std; char map[][][];  //第一维其实只要5就够了,当时一看状态1024就没多想,反正1024也没关系,数据小~~
int visit[][][];
int n,m,ma; int dir[][]={,,,-,,,-,}; struct node {
int x,y;
}st; void cpy (int d,int s){
for (int i=;i<n;i++)
for (int j=;j<m;j++)
map[d][i][j]=map[s][i][j];
} void rvisit (int o){
for (int i=;i<n;i++)
for (int j=;j<m;j++)
visit[o][i][j]=;
} int bfs (int o,int ans,node st){//cout<<st.x<<" "<<st.y<<endl;
node a,b,c;
queue<node> q;
while (!q.empty())
q.pop ();
q.push (st);
rvisit (o);
visit[o][st.x][st.y]=;
while (!q.empty ()){
a=q.front ();
q.pop ();
int xx,yy;
for (int i=;i<;i++){
xx=a.x+dir[i][];
yy=a.y+dir[i][];
if (visit[o][xx][yy])
continue ;
if (xx<||xx>=n||yy<||yy>=m)
continue ;
if (map[o][xx][yy]=='X'||map[o][xx][yy]=='O')
continue ;
if (map[o][xx][yy]=='C'){
ans++;
map[o][xx][yy]='.';
}
b.x=xx;b.y=yy;
q.push (b);
visit[o][xx][yy]=;
}
}
ma=max (ma,ans);
q.push (st);
rvisit (o);
visit[o][st.x][st.y]=;
while (!q.empty ()){
a=q.front ();//if (o==0)cout<<o<<":"<<a.x<<" "<<a.y<<endl;
q.pop ();
int xx,yy;
for (int i=;i<;i++){
xx=a.x+dir[i][];
yy=a.y+dir[i][];
if (visit[o][xx][yy])
continue ;
if (xx<||xx>=n||yy<||yy>=m)
continue ;
if (map[o][xx][yy]=='X')
continue ;
if (map[o][xx][yy]=='O'){
int xxx,yyy;
xxx=xx+dir[i][];
yyy=yy+dir[i][];
if (xxx<||xxx>=n||yyy<||yyy>=m)
continue ;
if (map[o][xxx][yyy]=='.'){
cpy (o+,o);
map[o+][xx][yy]='.';
map[o+][xxx][yyy]='X';//cout<<o<<":"<<a.x<<" "<<a.y<<"|"<<xx<<" "<<yy<<"|"<<xxx<<" "<<yyy<<endl;
c.x=xx;c.y=yy;
bfs (o+,ans,c);
} continue ;
}
b.x=xx;b.y=yy;//if (o==0) cout<<a.x<<" "<<a.y<<"|"<<xx<<" "<<yy<<endl;
q.push (b);
visit[o][xx][yy]=;
}
}
} int main (){
int t;
scanf ("%d",&t);
while (t--){
scanf ("%d%d",&n,&m);
for (int i=;i<n;i++){
scanf ("%s",map[][i]);
for (int j=;j<m;j++){
if (map[][i][j]=='S'){
st.x=i;st.y=j;
//map[0][i][j]='.';
}
}
}//cout<<st.x<<" "<<st.y<<endl;cout<<map[0][st.x][st.y]<<endl;
ma=;
bfs (,,st);
printf ("%d\n",ma);
}
return ;
}

CSU 1119 Collecting Coins的更多相关文章

  1. UVA 12510/CSU 1119 Collecting Coins DFS

    前年的省赛题,难点在于这个石头的推移不太好处理 后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可.先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找 ...

  2. csuoj 1119: Collecting Coins

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

  3. Codeforces D. Sorting the Coins

    D. Sorting the Coins time limit per test 1 second memory limit per test 512 megabytes input standard ...

  4. codeforces 876 D. Sorting the Coins

    http://codeforces.com/contest/876/problem/D D. Sorting the Coins time limit per test 1 second memory ...

  5. D. Sorting the Coins

    Recently, Dima met with Sasha in a philatelic store, and since then they are collecting coins togeth ...

  6. ACM-ICPC (10/16) Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)

    A. Trip For Meal Winnie-the-Pooh likes honey very much! That is why he decided to visit his friends. ...

  7. 湖南省第八届大学生计算机程序设计竞赛(A,B,C,E,F,I,J)

    A 三家人 Description 有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列, ...

  8. Codeforces Round #615 (Div. 3)

    A. Collecting Coins 题目链接:https://codeforces.com/contest/1294/problem/A 题意: 你有三个姐妹她们分别有 a , b , c枚硬币, ...

  9. Codeforces Round#615 Div.3 解题报告

    前置扯淡 真是神了,我半个小时切前三题(虽然还是很菜) 然后就开始看\(D\),不会: 接着看\(E\),\(dp\)看了半天,交了三次还不行 然后看\(F\):一眼\(LCA\)瞎搞,然后\(15m ...

随机推荐

  1. bug经验

    1.异常信息丢失导致定位问题困难. 2.findbugs工具 3.在某些if语句判断中return,可能会导致文件句柄无法关闭. 4.lastmodified()在win下和linux下的处理是不同的 ...

  2. 记录终端输出的LOG到文件

    先要说明为什么要记录终端会话,因为常会遇到这样的情况,终端是有缓存大小限制的,当在终端打印的消息超出缓存范围,它前面的打印消息就自动丢失了,这对于我们调试程序会造成障碍,所以有记录完整终端打印消息的必 ...

  3. commons-pool2-中的一些配置

      /**                     * 连接失效检测相关                     */                    // 空闲时进行连接测试,会启动异步evi ...

  4. CSS3 Flexbox布局那些事

    相信研究过CSS3的同学对Flexbox布局一定不会陌生(作为一个未来主流的布局方式,至少有所耳闻).最近完成了两个项目:一个是移动端H5项目,一个是嵌入HTML页面的mac客户端项目.为了庆祝这两个 ...

  5. Verdigris: Qt without moc

    https://woboq.com/blog/verdigris-qt-without-moc.html https://github.com/woboq/verdigris

  6. PowerShell中调用外部程序和进程操作命令例子

    学习PowerShell,我们不指望通过C#编程去搞定所有事情,我们应该记住cmd.exe或者说批处理给我们留下的宝贵财富——通过调用外部程序去解决问题.调用了外部程序,势必就要对进程进行管理,这就是 ...

  7. Activity小结

    Log日志类的五种级别 1.由高到低分别是:v.i.d.w.e 2.生命周期有七种状态: onCreate:创建 onStart:启动 onResume:显示(可以与用户交互) onPause:暂停 ...

  8. 获取java类和方法名

    String clazz = this.getClass().getName(); String method = Thread.currentThread() .getStackTrace()[1] ...

  9. Visual Studio 2008项目中WinForm窗口图标显示为类图标,仅仅能打开代码而无法打开视图问题解决

    背景:         今天打开一个Winform项目的时候.图标显示为类文件的样子而不是窗口的样子,在代码中右键也没有View Designer选项.双击图标打开的是代码而非窗口设计界面,百度后也没 ...

  10. Linux编程环境介绍(1) -- linux的历史

    1. linux是什么? "Hello everybody out there using minix——I'm doing a (free) operating system"  ...