题目描述
题目 1465: [蓝桥杯][基础练习VIP]回形取数
时间限制: 1Sec 内存限制: 128MB 提交: 2641 解决: 852
题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
Note:
主要是这个方向问题,我之前错误的原因是因为,递归dfs的话每次都是优先选择向下,但是这不符合题目要求,递归也可以写,但是建议迭代解法!
错误代码dfs
#include <iostream>
using namespace std;
int change[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
int maps[1005][1005];
int vis[1005][1005];
int m, n;
bool isValid(int tx, int ty) {
if (tx<0 || ty<0 || tx>=m || ty>=n || vis[tx][ty]==1) return false;
return true;
}
void dfs(int x, int y) {
for (int i=0; i<4; i++) {
int tx = x + change[i][0];
int ty = y + change[i][1];
if (!isValid(tx, ty)) continue;
cout << " " <<maps[tx][ty];
vis[tx][ty] = 1;
dfs(tx, ty);
}
}
int main() {
cin >> m >> n;
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cin >> maps[i][j];
}
}
cout << maps[0][0];
vis[0][0] = 1;
dfs(0, 0);
return 0;
}
递归代码
#include <iostream>
using namespace std;
int change[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
int maps[1005][1005];
int vis[1005][1005];
int m, n;
int dir = 0;
int tot = 0;
bool isValid(int tx, int ty) {
if (tx<0 || ty<0 || tx>=m || ty>=n || vis[tx][ty]==1) return false;
return true;
}
void dfs(int x, int y) {
while (tot < m*n) {
int tx = x + change[dir][0];
int ty = y + change[dir][1];
if (!isValid(tx, ty)){
dir = (dir+1)%4;
continue;
}
cout << " " <<maps[tx][ty];
vis[tx][ty] = 1;
tot ++;
dfs(tx, ty);
}
return;
}
int main() {
cin >> m >> n;
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cin >> maps[i][j];
}
}
cout << maps[0][0];
vis[0][0] = 1;
tot = 1;
dfs(0, 0);
return 0;
}
迭代解法
/*
@ 迭代
*/
#include <iostream>
using namespace std;
int change[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
int maps[1005][1005];
int vis[1005][1005];
int m, n;
int tot = 1;
bool isValid(int tx, int ty) {
if (tx<0 || ty<0 || tx>=m || ty>=n || vis[tx][ty]==1) return false;
return true;
}
int main() {
cin >> m >> n;
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
cin >> maps[i][j];
}
}
tot = 1;
int x=0, y=0;
vis[x][y] = 1;
int dir = 0;
cout << maps[x][y];
while (tot < m*n) {
int tx = x + change[dir][0];
int ty = y + change[dir][1];
if (!isValid(tx, ty)) {
dir = (dir+1)%4;
continue;
}
x = tx;
y = ty;
vis[x][y] = 1;
tot++;
cout <<" "<<maps[x][y];
}
return 0;
}
不懂的点可以问我!