原题链接:蛇形填数
解题思路:通过dfs填写最方便 详解请看代码
注意事项:1、向下和向右都能走时要向右走,需要特判
2、for循环找方向时要按照下左上右的顺序
3、每行最后一个元素后没有空格
参考代码:
#include<iostream>
using namespace std;
const int N=110;
int a[N][N],n;
int dx[4]={1,0,-1,0},dy[4]={0,-1,0,1}; //方向按照下左上右
bool find(int xx,int yx) //判断能不能走
{
if(a[xx][yx]==0&&xx>0&&yx>0&&xx<=n&&yx<=n) //没走过并且没出界
return true;
return false;
}
void dfs(int x,int y,int t)
{
a[x][y]=t; // 给数组相应位置赋值
if(t==n*n) // 最后一个数为n*n,结束
return ;
if(find(x+1,y)&&find(x,y+1)) //如果向右向下都能走 则向右走
dfs(x,y+1,t+1);
for(int i=0;i<4;i++)
{
int xx=x+dx[i],yx=y+dy[i];
if(find(xx,yx))
dfs(xx,yx,t+1);
}
}
int main(void)
{
while(cin>>n){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=0; //初始化数组为0
dfs(1,n,1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(j==n)
cout<<a[i][j]<<endl; //最后一个元素输出换行
else
cout<<a[i][j]<<' ';
}
cout<<endl;}
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复