SWUST OJ 1693 冰壶运动
2016-04-22 22:11
197 查看
给你一个长宽的图,0代表空地,1代表墙,2代表起点,3代表目标点,类似于冰壶运动,每次往一个方向滑动,如果旁边有墙就不能滑动,如果滑动过程中撞到墙,墙就变为0空地,冰壶停在墙的上一个点,就直接DFS暴力搜就是了,注意滑动过程的判断;
#include<stdio.h> #include<string.h> int map[30][30],m,n,min; int dir[4][2]={-1,0,0,-1,1,0,0,1}; void DFS(int x,int y,int step) { int dx=x,dy=y; if(step>10) return; if(map[x][y]==3) { if(step<min) min=step; } for(int i=0;i<4;i++) { dx=x; dy=y; int count=0; step++; while(dx>=0&&dx<n&&dy>=0&&dy<m) { dx=dx+dir[i][0]; dy=dy+dir[i][1]; if(map[dx][dy]==1&&count==0) break; count++; if(dx>=0&&dx<n&&dy>=0&&dy<m) { if(map[dx][dy]==3) { if(step<min) min=step; return; } if(map[dx][dy]==1) { map[dx][dy]=0; DFS(dx-dir[i][0],dy-dir[i][1],step); map[dx][dy]=1; break; } } } step--; } } int main() { int dx,dy; while(scanf("%d%d",&m,&n)!=EOF) { min=11; if(m==0&&n==0) break; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&map[i][j]); if(map[i][j]==2) { dx=i; dy=j; } } } DFS(dx,dy,0); if(min==11) printf("-1\n"); else printf("%d\n",min); } return 0; }
相关文章推荐
- CodeForces 628C
- 机器学习基础(五十四)—— 支持向量机(SVM)
- 易语言学习第七课
- 好难的spring错误
- HDOJ(HDU) 1977 Consecutive sum II(推导、、)
- 归并排序
- 站立会议04
- HDOJ(HDU) 1977 Consecutive sum II(推导、、)
- 《校园封神榜》典型用户和用户场景
- 构建之法阅读笔记03
- 产品需求分析
- 团队项目:二次开发
- 典型用户模版和场景
- C函数原理
- 通过GridView实现一个自定义的一个日历控件
- LeetCode|Count Primes
- 解决 java.lang.IllegalThreadStateException: Thread already started. 错误
- 多用字面量语法,少用与之等价的方法
- 《校园封神榜》个人工作总结——第五天
- 个人工作总结(4)