Storm有一个m行n列的整数矩阵。c++
他会从(1,1)开始,顺时针螺旋访问该矩阵,每一个元素刚好被访问一次。数组
请你按Storm的访问顺序输出每一个元素。
spa
Storm有一个m行n列的整数矩阵。c++
他会从(1,1)开始,顺时针螺旋访问该矩阵,每一个元素刚好被访问一次。数组
请你按Storm的访问顺序输出每一个元素。
spa
第一行输入整数t,表示有t组数据,0 < t < 50;
第一行输入两个数m和n,其中0<m,n≤500;
以后m行,每行n个数以空格隔开,表示这个矩阵。code
输出t行,每行表示每组螺旋输出的结果orm
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 。一直在深搜 , 而回溯为空 。