基礎練習-回形取數


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;	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章