# 回形取数



时间限制: 1Sec 内存限制: 128MB 提交: 1831 解决: 590

提交地址：

https://www.dotcpp.com/oj/problem1465.html

**题目描述**

- 回形取数就是沿矩阵的边取数，若当前方向上无数可取或已经取过，则左转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
```

### 思路一


```
m,n=map(int,input().split())
nn=[]
for i in range(m):
    nn.append(input().split())
dir=[[1,0],[0,1],[-1,0],[0,-1]]
re=[]
x=0
y=0
state=0
n_left=0
m_left=0
m_right=m-1
n_right=n-1
while len(re)<m*n:
    re.append(nn[x][y])
    tx,ty=dir[state]
    if ((tx+x)>m_right):
        state=(state+1)%4
        n_left+=1
    elif((tx+x)<m_left):
        state=(state+1)%4
        n_right-=1
    elif((ty+y)>n_right):
        state=(state+1)%4
        m_right-=1
    elif ((ty+y)<n_left):
        state=(state+1)%4
        m_left+=1
    tx,ty=dir[state]
    x+=tx
    y+=ty
print(' '.join(re))
```

    3 3
    1 2 3
    4 5 6
    7 8 9
    1 4 7 8 9 6 3 2 5


### 思路二


```
def op(state_i,state_j,i,j):
    if state_i==1:
        i+=1
    elif state_i==2:
        i=i
    elif state_i==3:
        i-=1
    if state_j==1:
        j+=1
    elif state_j==2:
        j=j
    elif state_j==3:
        j-=1
    return [i,j]


dir
m,n=map(int ,input().split())
map_=[]
for i in range(m):
    map_.append(list(input().split()))



i=0
j=0
statei=[1,2,3,2]
statej=[2,1,2,3]
state_i=0
state_j=0
# label=0
while True :
    print(map_[i][j],end=' ')
    map_[i][j]='#'
    t1,t2=op(statei[state_i],statej[state_j],i,j)
    if t1==m or t2==n or map_[t1][t2]=='#':#(i==m-1 and (j==0 or j==n-1))or (j==n-1and(i==0 or i==m-1))
#         print(i,j)
        state_i=(state_i+1)%4
        state_j=(state_j+1)%4
        i,j=op(statei[state_i],statej[state_j],i,j)
        if i==m or j==n or map_[i][j]=='#' :#(i==m-1 and (j==0 or j==n-1))or (j==n-1and(i==0 or i==m-1))or
            break
        else :
            continue
    i,j=op(statei[state_i],statej[state_j],i,j)
        
```

    3 2
    1 2
    3 4
    5 6
    1 3 5 6 4 2 