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. leetcode_Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  2. NOI 2013 矩阵游戏

    http://uoj.ac/problem/124 矩阵乘法. 十进制快速幂. 刚开始还傻傻地写二进制快速幂,然后陈老师一语点醒梦中人...... #include<cstdio> #in ...

  3. Windows 8.1下使用IE 64位

    Internet Options -> Advanced -> Settings Security组 对Enable 64-bit processes for Enhanced Prote ...

  4. 第33讲 UI组件_进度条ProcessBar和消息队列处理器handler

    第33讲UI组件_进度条ProcessBar和消息队列处理器handler 1. 进度条ProcessBar 一个可视化的进度指示器,代表正在执行的耗时任务.可以为用户展示一个进度条,表示正在执行的任 ...

  5. tomcat动态映射路径

    写了一个工具类,将上传文件功能保存文件的目录移到webapps目录外面,通过动态生成xml映射文件到tomcat\conf\Catalina\localhost目录下从而实现目录映射.可以被http直 ...

  6. JavaScript函数 bind call apply区别

    1. apply calll 在JavaScript中 call 和 apply 都是为了改变某个函数运行时上下文而存在的, 换句话说就是为了改变函数内部的this的指向. 这里我们有一个新的对象 b ...

  7. Impala 源码分析-FE

    By yhluo 2015年7月29日 Impala 3 Comments Impala 源代码目录结构 SQL 解析 Impala 的 SQL 解析与执行计划生成部分是由 impala-fronte ...

  8. 理清fineuploader无刷新上传的一些事

    1.fineuploader是一款不依赖与jquery的异步无刷新上传组件,fineuploader采用ajax方式实现对文件上传,返回值都是以json的格式,对后台服务器操作和前端dom对象一些操作 ...

  9. DEV GridControl 鼠标单击事件

    private void gridView1_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) { ...

  10. CSS transform(变形)和transform-origin(变形原点)

    transform(变形)和transform-origin(变形原点)的说明: 目前这两个属性得到了除去ie以外各个主流浏览器webkit,firefox,opera的支持,属性名分别为 -webk ...