本文主要是介绍2011蓝桥杯第八题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这道题很容易理解,就是将数字从1开始逐渐递增不断填充到上三角形中,而且是按顺时针旋转方向进行填充,实际上就是一道模拟题,或者说是搜索题,对于当前的每一个位置,下一步都有且只有两种选择,当两种选择都无法满足时也就说明上三角形已经被填满。具体的分析过程在我的代码中会有详细的说明,下面是代码:
#include <stdio.h>
#include <stdlib.h>
#define Max 21 //数据上限
int p[Max][Max]; //用来记录三角形数据
bool record[Max][Max]; //用来标记数组是否被填充
int n;
int cal; //每次要填充的数据//位于什么方向,和具体的坐标,方向总共有三种,L(向左),X(向斜下),H(向上)
//根据当前位置的方向来判断下一步要填充的位置,每一种方向,下一步有两种选择
void Dfs(char dir,int x,int y){switch(dir){
case 'L':if(y+1<=n && !record[x][y+1]){ //当方向为向左时,如果向左还可以填充则继续向左,并填充,否则就向斜下方向填充record[x][y+1]=1;p[x][y+1]=cal++;Dfs('L',x,y+1);}else if(x+1<=n && y-1>=1 && !record[x+1][y-1]){record[x+1][y-1]=1;p[x+1][y-1]=cal++;Dfs('X',x+1,y-1);}break;
case 'X':if(x+1<=n && y-1>=1 && !record[x+1][y-1]){ //当方向为向斜下时,若向斜下还可以填充则继续向斜下,并填充,否则向上填充record[x+1][y-1]=1;p[x+1][y-1]=cal++;Dfs('X',x+1,y-1);}else if(x-1>=1 && !record[x-1][y]){record[x-1][y]=1;p[x-1][y]=cal++;Dfs('H',x-1,y);}break;
case 'H':if(x-1>=1 && !record[x-1][y]){ //当方向为向上时,若向上还可以填充则继续向上填充,否则向左填充record[x-1][y]=1;p[x-1][y]=cal++;Dfs('H',x-1,y);}else if(y+1<=n && !record[x][y+1]){record[x][y+1]=1;p[x][y+1]=cal++;Dfs('L',x,y+1);}
} //当所有方向情况下都不能继续填充时,则说明已经填充完毕,退出
}int main(){scanf("%d",&n);int i,j;for(i=0;i<Max;i++)for(j=0;j<Max;j++)record[i][j]=0; //初始化为0,即没有被访问record[1][1]=1; //标记第一个数字为访问p[1][1]=1;//填充第一个数字为1cal=2;//第二个要填充的数字为2Dfs('L',1,1);for(i=1;i<=n;i++){for(j=1;j<=(n-i+1);j++)printf("%4d",p[i][j]); //输出上三角形printf("\n");}return 0;
}
这篇关于2011蓝桥杯第八题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!