对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
输入格式
输入的第一行包含两个整数 n, m,分别表示螺旋矩阵的行数和列数。
第二行包含两个整数 r, c,表示要求的行号和列号。
输出格式
输出一个整数,表示螺旋矩阵中第 r 行第 c 列的元素的值。
样例输入
4 5
2 2
样例输出
15
评测用例规模与约定
对于 30% 的评测用例,2 <= n, m <= 20。
对于 70% 的评测用例,2 <= n, m <= 100。
对于所有评测用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。
螺旋矩阵的问题
作者这种想法很好
可以借鉴
需要注意以下几点
1 ++cnt不能改为cnt++ 因为只有这样,才能保证每次都刚好走到底
2 一定到判断某个位置的当前状态
3 认真的在大脑中把程序过一遍,就可以发现问题
#include<iostream>
using namespace std;
int p[1005][1005];//存储当前位置的数值
bool dp[1005][1005];//存储当前位置是否被访问过
int main(){
int n,m;
int r,c;
cin>>n>>m>>r>>c;
int cnt=0;
int sum=n*m;
int row=1,col=0;
while(cnt<sum){
//向右走
while(col<m&&!dp[row][col+1]){
p[row][++col]=++cnt;
dp[row][col]=1;
}
//向下走
while(row<n&&!dp[row+1][col]){
p[++row][col]=++cnt;
dp[row][col]=1;
}
//向左走
while(col>1&&!dp[row][col-1]){
p[row][--col]=++cnt;
dp[row][col]=1;
}
//向上走
while(row>1&&!dp[row-1][col]){
p[--row][col]=++cnt;
dp[row][col]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<p[i][j]<<" ";
}
cout<<endl;
}
cout<<p[r][c];
return 0;
}
有问题可以留言交流٩(๑❛ᴗ❛๑)۶