1. 程式人生 > 其它 >c++編輯回形矩陣,codeblocks編寫。

c++編輯回形矩陣,codeblocks編寫。

技術標籤:C語言c++

回形要求,中間空格,每一行後不得有空格,要求大小自己定義。
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[101][101];
    cin>>n;
    int count=0,i=1,j=1,x=1;//i,j記錄陣列的變數,x是圈數記錄
    int n1=n,i2=i,j2=j;//n1是圈範圍變數,i2,j2是變圈後的迴圈變數,其不能與i,j搞混。
while(count<n*n){ if(i2!=n1&&j2!=n1){//該判斷是入圈時機,不能用i,j代替,當且緊當i2,j2在最外圈(即x==1)才可代替。 for(int i1=1;i1<=n1-1;i1++){ a[i][j]=++count; j++; j2++; } } else if(i2!=n1&&j2==n1){ for
(int i1=1;i1<=n1-1;i1++){ a[i][j]=++count; i++; i2++; } //i++; } else if(i2==n1&&j2==n1){ for(int i1=1;i1<=n1-1;i1++){ a[i][j]=++count; j--
; j2--; } //j--; } else if(i2==n1&&j2!=n1){ for(int i1=1;i1<=n1-1;i1++){ a[i][j]=++count; i--; i2--; } if(i==j){ i++; j++; x++; n1-=2; i2=1; j2=1; if(n1==1){ a[i][j]=++count; break; } } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<a[i][j]; if(j==n){ cout<<endl; } else{ cout<<" "; } } } return 0; }

寫這段程式碼的時候老毛病又犯了,就是沒有想清楚最佳的方法去寫,總是想著矩陣拐角轉彎時要加入if語句,行是行,可是有點傻啊。最後想到,反正是回形,每一次都有迴圈,何不直接四個迴圈就好了嗎?當收縮一圈時,迴圈範圍變小便可以了,下面是改進後的程式碼:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[100][100];
    int count=0,first=0,_end=n-1;
    while(count<n*n){
        for(int i=first;i<_end;i++){
            a[first][i]=++count;
        }
        for(int i=first;i<_end;i++){
            a[i][_end]=++count;
        }
        for(int i=_end;i>first;i--){
            a[_end][i]=++count;
        }
        for(int i=_end;i>first;i--){
            a[i][first]=++count;
        }
        first++;_end--;
        if(first==_end){
            a[first][_end]=++count;
            break;
        }

    }
     for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<a[i][j];
            if(j==n-1){
                cout<<endl;
            }
            else{
                cout<<" ";
            }
        }
    }
    return 0;
}

所以,在編寫每一個問題的時候,一定要想要方法,可以在腦海裡演算一遍,最後想出合適的演算法再寫,不然想我一樣想到什麼寫什麼很吃虧。