らせん行列
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回アクセスする.
構想:題意に従ってシミュレーションすればよく、コード、時間複雑度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;
}