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的更多相关文章
-
UVA 12510/CSU 1119 Collecting Coins DFS
前年的省赛题,难点在于这个石头的推移不太好处理 后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可.先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找 ...
-
csuoj 1119: Collecting Coins
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1119 1119: Collecting Coins Time Limit: 3 Sec Memo ...
-
Codeforces D. Sorting the Coins
D. Sorting the Coins time limit per test 1 second memory limit per test 512 megabytes input standard ...
-
codeforces 876 D. Sorting the Coins
http://codeforces.com/contest/876/problem/D D. Sorting the Coins time limit per test 1 second memory ...
-
D. Sorting the Coins
Recently, Dima met with Sasha in a philatelic store, and since then they are collecting coins togeth ...
-
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. ...
-
湖南省第八届大学生计算机程序设计竞赛(A,B,C,E,F,I,J)
A 三家人 Description 有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列, ...
-
Codeforces Round #615 (Div. 3)
A. Collecting Coins 题目链接:https://codeforces.com/contest/1294/problem/A 题意: 你有三个姐妹她们分别有 a , b , c枚硬币, ...
-
Codeforces Round#615 Div.3 解题报告
前置扯淡 真是神了,我半个小时切前三题(虽然还是很菜) 然后就开始看\(D\),不会: 接着看\(E\),\(dp\)看了半天,交了三次还不行 然后看\(F\):一眼\(LCA\)瞎搞,然后\(15m ...
随机推荐
-
hdu 2795 线段树(二维问题一维化)
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
-
Jquery获取selelct选中值
误区: 一直以为jquery获取select中option被选中的文本值,是这样写的: $("#s").text(); //获取所有option的文本值 实际上应该这样: $(& ...
- SIMATIC PCS 7 结构图
-
Linux Shell编程(19)——测试与分支
case和select结构在技术上说不是循环,因为它们并不对可执行的代码块进行迭代.但是和循环相似的是,它们也依靠在代码块的顶部或底部的条件判断来决定程序的分支.在代码块中控制程序分支case (in ...
-
Writing clean code is what you must do in order to call yourself a professional.
Clean Code A Handbook of Agile Software Craftsmanship
-
嵌入式系统及应用课程设计——基于STM32的温湿度监测系统
大三上学期期末总结,嗯,没错上学期,写在新学期开始,hhh. 上学期学了一门嵌入式系统及应用的课程,期末的课程设计题目是基于STM32的温湿度监测系统. 记得刚开始做课程设计的时候,听说先设计画出原理 ...
-
c++ 的绝对值函数
添加头文件 #include <cmath> 对于整数 abs(); 对于浮点数 fabs();
-
20145236《网络对抗》Exp8 WEB基础实践
20145236<网路对抗>Exp8 WEB基础实践 一.基础问题回答 什么是表单 表单在网页中主要负责数据采集功能 一个表单有三个基本组成部分: 表单标签 表单域:包含了文本框.密码框. ...
-
Android中五种常用的menu
Android Menu在手机的应用中起着导航的作用,作者总结了5种常用的Menu. 1.左右推出的Menu 前段时间比较流行,我最早是在海豚浏览器中看到的,当时耳目一新.最早使用左右推出菜单的,听说 ...
-
关于恶意说说自动在QQ空间转发的机制
有些很讨厌的带链接说说,只要你在手机打开它,就会自动转发,内容极其不雅 一怒之下我决定看个究竟首先,在此页开头有此关键语句: <iframe src="http://rtb.map.q ...