蓝桥杯练习——回形取数
題目描述
回形取數(shù)就是沿矩陣的邊取數(shù),若當(dāng)前方向上無(wú)數(shù)可取或已經(jīng)取過(guò),則左轉(zhuǎn)90度。一開始位于矩陣左上角,方向向下。
輸入
輸入第一行是兩個(gè)不超過(guò)200的正整數(shù)m,? n,表示矩陣的行和列。接下來(lái)m行每行n個(gè)整數(shù),表示這個(gè)矩陣。
輸出
輸出只有一行,共mn個(gè)數(shù),為輸入矩陣回形取數(shù)得到的結(jié)果。數(shù)之間用一個(gè)空格分隔,行末不要有多余的空格。
樣例輸入
3 3 1 2 3 4 5 6 7 8 9樣例輸出
1 4 7 8 9 6 3 2 5?
這道題其實(shí)就是一個(gè)找規(guī)律的題,找好規(guī)律后幾個(gè)循環(huán)就可以完成輸出。
如上圖所示,m為行數(shù),n為列數(shù),以一個(gè)m=5,n=5的5*5的矩陣為例,先忽略數(shù)字,把每一個(gè)數(shù)字當(dāng)作矩陣中的一個(gè)點(diǎn),由題意可知輸出順序是從外圈到內(nèi)圈的逆時(shí)針順序。以最外圈為例,其輸出為從(0,0)到(m-1,0)的紅色點(diǎn),然后是橙色點(diǎn),然后是黃色,最后是綠色,按照逆時(shí)針的順序,外圈輸出完畢。
如上圖所示為第二圈,就是以(1,1)為起始點(diǎn)的圈,其順序依舊是紅、橙、黃、綠,第二圈輸出完畢,最后是內(nèi)圈(2,2),只有一個(gè)點(diǎn),直接輸出。這樣,一個(gè)矩陣就輸出完畢。
不難發(fā)現(xiàn)其中的輸出規(guī)律,每次輸出按圈逆時(shí)針輸出,從外圈到內(nèi)圈,起始點(diǎn)為(0,0),(1,1,),(2,2)。也就是說(shuō),每次只要找到起始點(diǎn),然后按照順序進(jìn)行紅、橙、黃、綠四次輸出就可以了。
假設(shè)每次的起始點(diǎn)為(x,x)
紅色的點(diǎn)為:(x,x)到(m-1-x,x)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?x坐標(biāo)依次加1
橙色的點(diǎn)為:(m-1-x,x+1)到(m-1-x,n-1-x)? ? ? ? ? ? ? ? ? ? y坐標(biāo)依次加1
黃色的點(diǎn)為:(m-2-x,n-1-x)到(x,n-1-x)? ? ? ? ? ? ? ? ? ? ? ? ?x坐標(biāo)依次減1
綠色的點(diǎn)為:(x,n-2-x)到(m-1-x,x+1)? ? ? ? ? ? ? ? ? ? ? ? ? ? y坐標(biāo)依次減1
通過(guò)以上的規(guī)律,每次更換不同的起始點(diǎn),通過(guò)四個(gè)for循環(huán)依次輸出紅、橙、黃、綠點(diǎn),直至全部輸完。
起始點(diǎn)就是每一圈的第一個(gè)點(diǎn),想要找到起始點(diǎn)首選要知道圈數(shù)。
全是應(yīng)該是(min(m,n)+1)/2? ,即行、列中最小數(shù)加一除2,除數(shù)是取整,由此可得圈數(shù)l,起始點(diǎn)則是(0,0)到(l-1,l-1)
第一個(gè)循環(huán)是起始點(diǎn)循環(huán),然后每個(gè)起始點(diǎn)控制的輸出再通過(guò)四個(gè)方向循環(huán)輸出。
?
有兩種特殊情況需要注意
1、m<n,且m為單數(shù)
這種情況在輸出完外圈后,內(nèi)圈只有一個(gè)從左到右的橫向輸出。
?
2、n<m,n為單數(shù)
這種情況在輸出完外圈后,內(nèi)圈只有一個(gè)從上到下的縱向輸出
?
因此在四個(gè)方向輸出前要判斷是否是最內(nèi)圈,且最內(nèi)圈是否滿足以上兩種情況,如果滿足則直接橫向或者縱向輸出,如果不滿足再進(jìn)行四個(gè)方向的輸出。
?
代碼:
#include<stdio.h>
int main()
{
?? ?int m,n;
?? ?scanf("%d%d",&m,&n); ? //輸入行數(shù)和列數(shù)?
?? ?int a[m][n];
?? ?int min=m<n?m:n;
?? ?int len=(min+1)/2;
?? ?for(int i=0;i<m;i++) ? ? //輸入矩陣中的數(shù)字?
?? ?{
?? ??? ?for(int j=0;j<n;j++)
?? ??? ?{
?? ??? ??? ?scanf("%d",&a[i][j]);
?? ??? ?}
?? ?}
?? ?for(int x=0;x<len;x++) ? ? ? ? //按照起始點(diǎn)依次按圈逆時(shí)針輸出?
?? ?{
?? ??? ?if(x==len-1&&((min+1)%2)==0) ? ?//如果是最內(nèi)圈?
?? ??? ?{
?? ??? ??? ?if(m<n) ? ? ? ? ? ? ? ?//這種情況是橫向輸出?
?? ??? ??? ?{
?? ??? ??? ??? ?for(int i=x;i<n-x;i++)
?? ??? ? ? ? ? ?{
?? ??? ??? ? ? ? ? printf("%d ",a[x][i]);
?? ? ? ? ? ? ? ?? ?}
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ??? ?else ? ? ? ? ? ? ? ? ? ? ?//縱向輸出?
?? ??? ??? ?{
?? ??? ??? ??? ?for(int i=x;i<m-x;i++)
?? ? ? ? ? ? ? ?{
?? ??? ? ? ? ? ? ? printf("%d ",a[i][x]);
?? ? ? ? ? ? ? ?}
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ?}
?? ? ? ?else
?? ? ? {
?? ?
? ?? ??? ? ? ? for(int i=x;i<m-x;i++) ? //紅色的點(diǎn)?
?? ? ? ? ? ?{
?? ??? ? ? ? ? printf("%d ",a[i][x]);
?? ? ? ? ? ?}
?? ?
?? ? ? ??? ?for(int i=x+1;i<n-x;i++) ? ?//橙色的點(diǎn)?
?? ? ? ? ? ?{
?? ? ? ? ? ??? ?printf("%d ",a[m-1-x][i]);
?? ? ? ? ? ?}
?? ?
?? ? ? ? ? ?for(int i=m-2-x;i>=x;i--) ? ?//黃色的點(diǎn)?
? ? ? ? ??? ?{
? ? ?? ??? ? ? ?printf("%d ",a[i][n-1-x]);
? ? ? ? ?? ?}
?? ?
?? ??? ? ? ?for(int i=n-2-x;i>x;i--) ? ? //綠色的點(diǎn)?
?? ? ? ? ? ?{
?? ??? ? ? ? ? ?printf("%d ",a[x][i]);
?? ? ? ? ? ?}
?? ?
?? ? ? ?}
? ? }
?? ?return 0;
?}?
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯练习——回形取数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【UnityShader】游戏角色服饰染
- 下一篇: mac 安装 maven 过程