范沐垚


私信TA

用户名:dotcpp0614554

访问量:5202

签 名:

好大喜功

等  级
排  名 196
经  验 6613
参赛次数 0
文章发表 87
年  龄 18
在职情况 学生
学  校 看今夜 小楼灯宴
专  业 尽是良辰美眷

  自我简介:

沽名钓誉

解题思路:通过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 人评分

  评论区

  • «
  • »