[Asalto previo al examen de la Copa Lanqiao] La 11ª Competencia Provincial de la Copa Lanqiao Simulación Matriz en espiral C / C ++

对于一个 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;
} 

有问题可以留言交流٩(๑❛ᴗ❛๑)۶

Supongo que te gusta

Origin blog.csdn.net/kieson_uabc/article/details/109084634
Recomendado
Clasificación