dfs遍历螺旋矩阵

来源:互联网 发布:迅雷9优化版 编辑:程序博客网 时间:2024/06/07 02:17

DFS螺旋矩阵




        螺旋矩阵:按照从外到里顺时针有一定次序的矩阵。

如:

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7


DFS特点:从第一个位置开始,方位往右时,再当前方位一直搜到底,无法继续搜下去时,按当前方向,顺时针旋转方位,可行时,再按照当前的方位,一直搜下去。


void dfs(int x,int y,int pi)//x,y当前位置,pi下一搜索方位{int i,xx,yy;for(i=pi;i<pi+4;i++)//在当前方位的条件下,对四个方位判断{xx=x+dx[i%4];yy=y+dy[i%4];if(flag(xx,yy))//flag()为可行条件,当前位置可行{...//操作a[xx][yy]=INT_MAX;//做已访问标记f(xx,yy,i%4);//再次搜当前方位}}}



打印矩阵




Problem Description
给你一个矩阵,按照从外向里以顺时针方向依次打印出每一个数字。
 

Input
多组数据,第一组数据两个数n和m(n,m<=20),分别代表行数和列数,接下来的n行,每行m个数。输入数据以0 0结束。
 

Output
依次按照题意打印出每个数。
 

Sample Input
3 41 2 3 45 6 7 8
9 10 11 120 0
 

Sample Output
1 2 3 4 8 12 11 10 9 5 6 7
 

【题解】


#include<bits/stdc++.h>using namespace std;#define maxsize 20int a[maxsize+2][maxsize+2],r,c,i,j;int dx[]={0,1,0,-1};//方位右、下、左、上int dy[]={1,0,-1,0};bool flag(int x,int y)//判断当前位置是否可行{return a[x][y]!=INT_MAX&&x>=0&&y>=0&&x<r&&y<c;}void f(int x,int y,int pi){int i,xx,yy;for(i=pi;i<pi+4;i++)//在当前方位的条件下,对四个方位判断{xx=x+dx[i%4];yy=y+dy[i%4];if(flag(xx,yy)){cout<<a[xx][yy]<<' ';a[xx][yy]=INT_MAX;//做已访问标记f(xx,yy,i%4);//再次所搜当前方位}}}int main(){while(cin>>r>>c,r||c){for(i=0;i<r;i++){for(j=0;j<c;j++)cin>>a[i][j];}cout<<a[0][0]<<' ';a[0][0]=INT_MAX;f(0,0,0);cout<<endl;}return 0;}

原创粉丝点击