CCF认证201412-2Z字形扫描

题目描述

CCF认证201412-2Z字形扫描

算法设计+题目分析

分析题目:

题目说横纵坐标最多到500,开一个1010*1010的矩阵;
核心就是在坐标中右移、下移、左下移、右上移;
要注意右移和下移的优先级的变化,就是到不同的边界,到底是右移还是下移。

关于为啥是90分,我也不太懂。

注意点+记录点

代码(90分)

环境
Visual C++6.0

#include <utility>
#include <stdio.h>

using namespace std;

int P[1010][1010]={0};
int main(){
	int n;
	scanf("%d", &n);
	for (int i=n-1; i>=0; i--){//纵坐标3,2,1,0
		for (int j=0; j<n; j++){//横坐标
			scanf("%d", &P[j][i]);
			//printf("%d ", P[j][i]);
		}
		//printf("\n");
	}
	pair<int, int> right(1,0);//往右移动一格
	pair<int, int> low(0,-1);//往下移动一格
	pair<int, int> left_low(-1,-1);//往左下移动一次
	pair<int, int> right_front(1,1);//往右上移动一次
	//算法:先往右移一格或往下一格(此时要判断是否结束),再往左下移到横坐标=0或纵坐标=0,在往右或往下移一格(此时要判断是否结束),再往右上移到横坐标=n-1或纵坐标=n-1,循环
	int x=0;
	int y=n-1;
	printf("%d ", P[x][y]);
	while(x<n && y<n){
		if (x==n-1){x==n-1的优先级更高,往下移一格
			//cout<<"low ";
			x+=low.first;
			y+=low.second;
			printf("%d ", P[x][y]);
		}
		else if(y==n-1){
			//cout<<"right ";
			x+=right.first;
			y+=right.second;
			if (x==n-1 && y==0){
				printf("%d", P[n-1][0]);
				break;
			}
			printf("%d ", P[x][y]);
			
		}
		while(x>0 && y>0){//往左下移到横坐标=0或纵坐标=0
			//cout<<"left_low ";
			x+=left_low.first;
			y+=left_low.second;
			printf("%d ", P[x][y]);
		}
		if(y==0){//y==0的优先级更高
			//cout<<"right ";
			x+=right.first;
			y+=right.second;
			if (x==n-1 && y==0){
				printf("%d", P[n-1][0]);
				break;
			}
			printf("%d ", P[x][y]);
		}
		else if (x==0){//往下移一格
			//cout<<"low ";
			x+=low.first;
			y+=low.second;
			printf("%d ", P[x][y]);
		}
		while(x<n-1 && y<n-1){
			//cout<<"right_front ";
			x+=right_front.first;
			y+=right_front.second;
			printf("%d ", P[x][y]);
		}
		
	}
	
	return 0;
}

感谢链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值