首页 > 其他 > 详细

H: 爱滴魔力转圈圈~~(dfs)

时间:2019-06-18 23:31:08      阅读:112      评论:0      收藏:0      [点我收藏+]

题目描述

Storm有一个m行n列的整数矩阵。

他会从(1,1)开始,顺时针螺旋访问该矩阵,每个元素恰好被访问一次。

请你按Storm的访问顺序输出每个元素。
 

输入

第一行输入整数t,表示有t组数据,0 < t < 50;
第一行输入两个数m和n,其中0<m,n≤500;
之后m行,每行n个数以空格隔开,表示这个矩阵。

输出

输出t行,每行表示每组螺旋输出的结果

样例输入

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

样例输出

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

题意很简单就是顺时针呈螺旋状将所有数组元素都访问一遍。

真没想到又是一道dfs题,通过这道题我也感受到dfs的强大。


#include <bits/stdc++.h>
using namespace std;
int a[1000][1000] ;
int dir[4][2] = {{0 , 1},{1 , 0},{0 , -1},{-1 , 0}};
int vis[1000][1000];
int y , x ;
void dfs(int m , int n , int di)
{
    cout << a[m][n] << " " ;
    for(int i = 0 ; i < 4 ; i++)
    {
        int newy = m + dir[(i + di) % 4][0] ;
        int newx = n + dir[(i + di) % 4][1] ;
        if(newy >= 1 && newy <= y && newx >= 1 && newx <= x && !vis[newy][newx])
        {
            vis[newy][newx] = 1 ;
            dfs(newy , newx , di + i); // 同过输出发现一个有趣的现象 i 始终为0 或 1 所有我将 i < 4 该为 i < 2 也AC 。
        }//当遇到需要转弯时 因if()条件不能过进不去。再次循环 i + 1 . 
    }

}
void init()
{
    memset(vis , 0 , sizeof(vis));
}

int main()
{
    int n ;
    cin >> n ;
    while(n--)
    {
        init();
        cin >> y >> x ;
        for(int i = 1 ; i <= y ; i++)
            for(int j = 1 ; j <= x ; j++)
            cin >> a[i][j];
        vis[1][1] = 1 ;//这个标记容易忘记。
        dfs(1 , 1 , 0);
        cout << endl ;
    }

    return 0;
}

 

并不是典型的dfs 。一直在深搜 , 而回溯为空 。 

H: 爱滴魔力转圈圈~~(dfs)

原文:https://www.cnblogs.com/nonames/p/11048416.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!