回形取数
来源:互联网 发布:阿里云邮箱注销 编辑:程序博客网 时间:2024/06/07 14:24
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
解题思路:
直接按下,右,上,左的方向进行深搜即可。同样也可以用while循环实现,速度要比深搜快。
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define fr(i,n) for(int i=0;i<n;i++)#define set(a,b) memset(a,b,sizeof(a))using namespace std;int m,n;int maze[210][210];bool vis[210][210];int tt;int ans[50000];bool in(int x,int y){if(x>=0&&x<m&&y>=0&&y<n)return true;return false;}void dfs(int x,int y,int dir){vis[x][y]=1;ans[tt++]=maze[x][y];if(dir==0){if(in(x+1,y)&&!vis[x+1][y])dfs(x+1,y,0);else if(in(x,y+1)&&!vis[x][y+1])dfs(x,y+1,1);}else if(dir==1){if(in(x,y+1)&&!vis[x][y+1])dfs(x,y+1,1);else if(in(x-1,y)&&!vis[x-1][y])dfs(x-1,y,2);}else if(dir==2){if(in(x-1,y)&&!vis[x-1][y])dfs(x-1,y,2);else if(in(x,y-1)&&!vis[x][y-1])dfs(x,y-1,3);}else if(dir==3){if(in(x,y-1)&&!vis[x][y-1])dfs(x,y-1,3);else if(in(x+1,y)&&!vis[x+1][y])dfs(x+1,y,0);}}int main(){cin>>m>>n;tt=0;set(vis,0);set(ans,0);fr(i,m)fr(j,n)cin>>maze[i][j];dfs(0,0,0);int t=0;fr(i,m)fr(j,n)if(i==m-1&&j==n-1)cout<<ans[t++]<<endl;elsecout<<ans[t++]<<" ";}
0 0
- 回形取数
- 回形取数
- 回形取数
- 回形取数
- 回形取数
- 回形取数
- 回形取数
- 回形取数
- 回形取数
- 回形取数
- 回形取数
- 17.回形取数
- 基础训练 回形取数
- 蓝桥杯:回形取数
- 搜索回形取数
- A1068. 回形取数
- 蓝桥杯 回形取数
- 蓝桥杯:回形取数
- codeforces 507 ABC
- 深入理解HTTP协议
- dom4j解析xml文档
- COM组件开发(三)——类厂对象
- Linux查看系统信息大全[备忘]
- 回形取数
- hbase0.98分布式部署
- 11g 搜集直方图导致不走索引
- 事务的隔离级别
- iOS开发-Protocol协议及委托代理(Delegate)传值
- 算法
- [POJ2826] An Easy Problem?! && 计算几何
- HTML5 canvas 做画板画图 可以做电子白板
- REST架构