c++編輯回形矩陣,codeblocks編寫。
阿新 • • 發佈:2021-02-14
回形要求,中間空格,每一行後不得有空格,要求大小自己定義。
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;
}
所以,在編寫每一個問題的時候,一定要想要方法,可以在腦海裡演算一遍,最後想出合適的演算法再寫,不然想我一樣想到什麼寫什麼很吃虧。