题目描述
算法设计+题目分析
分析题目:
题目说横纵坐标最多到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;
}
感谢链接
无