注:一定,一定要注意在取數過程中,控制循環的各個變量的變化。還有就是記得在取數過程中,將取過的數進行標記,避免重復取數。

#include <iostream> using namespace std; int main() { int m,n,i,j,x,y,top; cin>>m>>n;int a[m][n]; for(i=0;i<m;i++) { for(j=0;j<n;j++) { cin>>a[i][j]; } } top=0;x=0;y=0; while(top<m*n)//當取出m*n個數時,循環結束 { while(x<m&&a[x][y]!=-1) { cout<<a[x][y]<<" "; a[x][y]=-1;//在取數過程中將取過的數進行標記,防止重復取數 top++; x++; }//down x--;y++;//在跳出循環時,x=m所以將x-1,因為y=0時的數以取過,所以y+1,向右開始取數 while(y<n&&a[x][y]!=-1) { cout<<a[x][y]<<" "; a[x][y]=-1; top++; y++; }//right x--;y--;//同理,此時開始向上取數。所以x-1,y跳出循環時y=n,所以此時y-1 while(x>=0&&a[x][y]!=-1) { cout<<a[x][y]<<" "; a[x][y]=-1; top++; x--; }//up x++;y--;//同理,開始向左取數。。。 while(y>=0&&a[x][y]!=-1) { cout<<a[x][y]<<" "; a[x][y]=-1; top++; y--; }//left x++;y++;//外層數已經取完,開始向內層進軍。此時進軍方式,x+1,y+1; } return 0; }
PS:還在進擊中,所以代碼寫的沒啥水平ε=(´ο`*)))