title: 基礎練習 回形取數
categories:
- ACM
- 邏輯
tags: - 回形取數
date: 2020-03-12 10:17:09
將一個方向的點遍歷並輸出,直到碰壁,然後改變方向,然後再輸出……。不能用dfs因爲需要的是碰壁再換方向,而不是每次都改變方向。
問題
試題 基礎練習 回形取數
資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
回形取數就是沿矩陣的邊取數,若當前方向上無數可取或已經取過,則左轉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
樣例輸入
3 2
1 2
3 4
5 6
樣例輸出
1 3 5 6 4 2
算法
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
//#include<map>
#define PI 3.14159265358979323
#define MAX 0x3f3f3f3f
using namespace std;
int map[210][210],m,n,sum=1,x,y;
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int main(){
//freopen("input2.txt", "r", stdin);
cin>>m>>n;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>map[i][j];
x=y=0;
cout<<map[0][0];
map[x][y]=-1;
while(sum!=m*n)
{
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
while(xx>=0&&xx<m&&yy>=0&&yy<n&&map[xx][yy]!=-1)
{
cout<<" "<<map[xx][yy];
map[xx][yy]=-1;
x=xx;
y=yy;
sum++;
xx=x+dir[i][0];
yy=y+dir[i][1];
}
}
}
return 0;
}