列表

详情


NC21646. 牛牛的迷宫题

描述

牛牛碰见一个迷宫题,按照传统套路,题目应该会这样
给你一个n*m的迷宫,每个格子要么是空的要么有障碍,你在(0,0)位置,要去(n-1,m-1)位置,每次可以走到相邻的一个空位上,走到终点最少需要走几步



现在牛牛碰到的迷宫题是这样的

构造一个n*m的迷宫,使得(0,0)到(n-1,m-1)的最短路为K



起点与终点必须为空地

输入描述

输入一个整数K (2 ≤ K ≤ 1000)

输出描述

第一行输出两个整数n,m

接下来输出n行,每行包含一个长度为m的字符串,只能由'.' 或者'#'构成

1 ≤ n ≤ 50

1 ≤ m ≤ 50

示例1

输入:

3

输出:

1 4
....

示例2

输入:

4

输出:

3 3
...
...
...

示例3

输入:

10

输出:

5 5
..#..
#.#..
..#..
.#...
.....

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 468K, 提交时间: 2022-01-25 11:37:44

#include <bits/stdc++.h>
using namespace std;
int n,m,k;
char c[60][60];
bool b[60][60];
int main()
{
    cin>>k;
    for(int i=1;i<=50;i++){
        for(int j=1;j<=50;j++)c[i][j]='#';
    }
    if(k<50){
        cout<<1<<" "<<k+1<<endl;
        for(int i=1;i<=k+1;i++)cout<<'.';
        cout<<endl;
        return 0;
    }
    k++;
    int dx=1;
    int m=50;
    int nx=1,ny=1;
    while(k>0){
        n=max(n,nx);
     //   cout<<nx<<" "<<ny<<" "<<k<<endl;
        c[nx][ny]='.';
        k--;
        if(dx==-1){
            if(k<=m*2&&(m-ny)%2!=k%2){
                nx++;
                continue;
            }
        }
        if(m-ny+2==k){
          //  cout<<"tsejiijs"<<nx<<" "<<ny<<endl;
            c[nx+1][ny]='.';
            for(int i=ny;i<=m;i++){
                c[nx+2][i]='.';
            } 
            n=nx+2;
            break;
        }
        if((dx==1||dx==0)&&ny==m){
            dx--;
            nx++;
            continue;
        }    
        if((dx==-1||dx==0)&&ny==1){
            dx++;
            nx++;
            continue;
        }
        ny+=dx;
    }
    cout<<n<<" "<<m<<endl;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)cout<<c[i][j];
        cout<<"\n";
    }
    return 0;
}

上一题