回形取数

来源:互联网 发布:阿里云邮箱注销 编辑:程序博客网 时间: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