SSL 2635_最小转弯问题_dfs
来源:互联网 发布:php 取整数 编辑:程序博客网 时间:2024/05/16 17:25
题目描述
在一个M×N的板上,有部分格子被标记为障碍(例如上图黑色标示的格子)。你任选一个空白格子放置一个小球(如上图灰点所示),并选择小球滚动的方向(上,下,左,右),小球将在板上一直滚动直至它碰到障碍,或板的边界,或它之前经过的格子。如果小球遇到以上情况之一将停下,你可以给它另选滚动的方向,然后小球将以同样的方式前进。如果小球在四个方向上都无法继续滚动,游戏结束,这时假如小球的轨迹覆盖板上所有的空白格子,你将获胜。上图展示的轨迹就是一个仅用10步获胜的例子。
你的任务是对给定板子,计算赢得游戏所需的最少步数。
思路
暴力dfs求解
从每一个点开始搜,记录一个可以走的总点数lf,每次走就lf–
若lf=1输出0
#include <stdio.h>#include <string>#include <queue>#include <iostream>#include <cstring>using namespace std;#define maxn 31#define fill(x,y) memset(x,y,sizeof(x))#define INF 0x7f7f7f7f#define max(x,y) x>y?x:yint ans=INF,n,m,lf,ls,xx,yy;int a[maxn][maxn],f[maxn][maxn];int dx[5]={0,1,0,-1,0};int dy[5]={0,0,1,0,-1};int dfs(int x,int y,int st){ for (int i=1;i<=4;i++) { int lx=x,ly=y,l=0; while (lx+dx[i]<=m&&lx+dx[i]>=1&&ly+dy[i]<=n&&ly+dy[i]>=1&&!a[lx+dx[i]][ly+dy[i]]&&!f[lx+dx[i]][ly+dy[i]]&&(lx+dx[i]!=xx||ly+dy[i]!=yy)) { f[lx+dx[i]][ly+dy[i]]=st+1; ls--; lx+=dx[i];ly+=dy[i]; } if (lx!=x||ly!=y) { if (ls==1&&st+1<ans) ans=st+1; dfs(lx,ly,st+1); } for (int j=1;j<=4;j++) { int lx=x,ly=y,l=0; while (lx+dx[j]<=m&&lx+dx[j]>=1&&ly+dy[j]<=n&&ly+dy[j]>=1&&!a[lx+dx[j]][ly+dy[j]]&&f[lx+dx[j]][ly+dy[j]]==st+1&&(lx+dx[j]!=xx||ly+dy[j]!=yy)) { ls++; f[lx+dx[j]][ly+dy[j]]=0; lx+=dx[j];ly+=dy[j]; } } }}int main(){ scanf("%d%d",&n,&m); lf=n*m; for (int i=1;i<=n;i++) { char ch[maxn]; cin>>ch; for (int j=0;j<m;j++) if (ch[j]=='*') { a[i][j+1]=1; lf--; } } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (!a[i][j]) { ls=lf; fill(f,0); xx=i,yy=j; f[i][j]=0; dfs(i,j,0); } if (ans==INF) ans=-1;if (lf==1) ans=0; printf("%d\n",ans);}
1 0
- SSL 2635_最小转弯问题_dfs
- SSL P2325 最小转弯问题 题目
- SSL P2325 最小转弯
- SSL_2325 最小转弯问题
- BFS(广搜) 最小转弯问题
- SSL 2603_最小路径覆盖问题_网络流
- SSL JudgeOnline 2277——最少转弯问题
- 洛谷 1434_滑雪_dfs
- uva_572_八连块_图论_DFS搜索
- 佳肴_纪中1420_dfs
- 砍树_纪中3079_dfs
- 洛谷 1164_小A点菜_dfs
- 洛谷 1433_吃奶酪_dfs
- 最少转弯问题
- 搜索中的转弯问题
- 【a802】最少转弯问题
- bfs转弯问题
- 【a802】最少转弯问题
- 自己一个新的规划
- 从一个URL里取出文件的拓展名
- 解决 php提交表单到当前页面,刷新会重复提交 的问题
- re库正则表达式常用操作符
- 简单高效epoll网络模型
- SSL 2635_最小转弯问题_dfs
- 欢迎使用CSDN-markdown编辑器
- vxlan
- 二叉树的遍历-按层次遍历
- 《Web全栈工程师的自我修养》浓缩笔记(上)
- STL之向量Vector
- 整合ssh时报错
- Spring的如何通过bean创建一个对象,并赋值。
- python初学者