らせん行列

11725 ワード

問題は、m行n列を含むm x n行列を指定し、プログラムはスパイラル順序に従って、行列内のすべての要素を出力する.複数のマトリクスを入力します.各マトリクスデータの1行目には2つの整数mとnがあり、次にmxnマトリクスの記述があり、m行があり、各行にはn個の整数出力が各マトリクスデータに対して螺旋順にマトリクス配列の要素を出力する.入力サンプル3 3 1 2 3 4 4 5 6 7 8 9出力サンプル1 2 3 6 8 4
構想:題意に従ってシミュレーションすればよく、コード、時間複雑度O(mn)を見て、各点に1回アクセスする.
#include
using namespace std;
const int maxn = 500;
int a[maxn][maxn]; 
bool vis[maxn][maxn]; //    
int main(){
    int m,n;
    while(cin >> m >> n){
        for(int i = 0; i < m; ++i){
            for(int j = 0; j < n; ++j){
                cin >> a[i][j];
                vis[i][j] = 0;
            }
        }
        int x = 0, y = 0;
        printf("%d",a[x][y]);//        
        vis[x][y] = 1;
        int sum = m * n, tot = 1; //             
        while(tot < sum){
            while(y + 1 < n && !vis[x][y+1]){ //        
                ++tot, vis[x][++y] = 1;
                printf(" %d",a[x][y]);
            }
            while(x + 1 < m && !vis[x+1][y]){ //        
                ++tot, vis[++x][y] = 1;
                printf(" %d",a[x][y]);
            }
            while(y - 1 >= 0 && !vis[x][y-1]){ //        
                ++tot, vis[x][--y] = 1;
                printf(" %d",a[x][y]);
            }
            while(x - 1 >= 0 && !vis[x-1][y]){ //        
                ++tot, vis[--x][y] = 1;
                printf(" %d",a[x][y]);
            }
        }
        putchar('
'
); } return 0; }