炫酷迷宫

1012 篇文章 42 订阅

https://ac.nowcoder.com/acm/contest/331/C

C++版本一

题解:

std

比如4*4,K=10的时候,很容易构造出:

....

xxx.

.xx.

....

于是得到了一种绕圈的想法。

但是在比如5*2,K=7中,绕圈法又遇到了阻碍,不如直走换边法,即

.x...

...x.

将这两种方法合并起来,即可以得到一种看起来还不错的解法。

如果能达到和以上算法同等优秀,就可以AC。

#include <bits/stdc++.h>
 
using namespace std;
 
//这份标程很不好看,建议阅读其他人的程序。
 
const int mn = 1005;
 
int n, m;
int k;
 
char s[mn][mn];
 
int calc(int n, int m) {
    int ans = 0;
    ans = n / 2 * (m + 1);
    if (n % 2 == 1) ans += m;
    return ans;
}
 
int lastx, lasty;
 
void genn() {
    int ans = -1;
    for (int i = 1; i <= n; i += 2) {
        if (i / 2 % 2 == 0) {
            for (int j = 1; j <= m; j++) {
                s[i][j] = '.';
                ans++;
                if (ans == k) {
                    lastx = i, lasty = j;
                    return;
                }
            }
            s[i + 1][m] = '.';
            ans++;
            if (ans == k) {
                lastx = i + 1, lasty = m;
                return;
            }
        } else {
            for (int j = m; j; j--) {
                s[i][j] = '.';
                ans++;
                if (ans == k) {
                    lastx = i, lasty = j;
                    return;
                }
            }
            s[i + 1][1] = '.';
            ans++;
            if (ans == k) {
                lastx = i + 1, lasty = 1;
                return;
            }
        }
    }
}
 
void genm() {
    int ans = -1;
    for (int i = 1; i <= m; i += 2) {
        if (i / 2 % 2 == 0) {
            for (int j = 1; j <= n; j++) {
                s[j][i] = '.';
                ans++;
                if (ans == k) {
                    lastx = j, lasty = i;
                    return;
                }
            }
            s[n][i + 1] = '.';
            ans++;
            if (ans == k) {
                lastx = n, lasty = i + 1;
                return;
            }
        } else {
            for (int j = n; j; j--) {
                s[j][i] = '.';
                ans++;
                if (ans == k) {
                    lastx = j, lasty = i;
                    return;
                }
            }
            s[1][i + 1] = '.';
            ans++;
            if (ans == k) {
                lastx = 1, lasty = i + 1;
                return;
            }
        }
    }
}
 
void app() {
    int u, d, l, r;
 
    u = 3, l = 1;
    d = n, r = m;
 
    int x = 1, y = 1;
 
    int c = 0;
    int step = 1;
    while (step) {
        if (c % 4 == 0) {  // right
            step = max(min(k, r - y), 0);
            for (int i = y; i <= y + step; i++) s[x][i] = '.';
            y += step;
            r -= 2;
        } else if (c % 4 == 1) {  // down
            step = max(min(k, d - x), 0);
            for (int i = x; i <= x + step; i++) s[i][y] = '.';
            x += step;
            d -= 2;
        } else if (c % 4 == 2) {  // left
            step = max(0, min(k, y - l));
            for (int i = y; i >= y - step; i--) s[x][i] = '.';
            y -= step;
            l += 2;
        } else if (c % 4 == 3) {  // up
            step = max(0, min(k, x - u));
            for (int i = x; i >= x - step; i--) s[i][y] = '.';
            x -= step;
            u += 2;
        }
        k -= step;
        c++;
    }
    lastx = x, lasty = y;
}
 
int main() {
    cin >> n >> m >> k;
 
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) s[i][j] = 'x';
    }
    if (max(calc(n, m), calc(m, n)) - 1 >= k) {
        if (calc(n, m) >= calc(m, n)) genn();
        else genm();
    }
    else app();
 
    printf("%d %d\n%d %d\n", 1, 1, lastx, lasty);
    for (int i = 1; i <= n; i++) puts(s[i] + 1);
 
    return 0;
}

C++版本二

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++) 
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f)) 
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define Scl(x) scanf("%lld",&x); 
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x); 
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long 
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
int read(){
    int x = 0,f = 1;
    char c = getchar();
    while (c<'0' || c>'9'){
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0'&&c <= '9'){
        x = x * 10 + c - '0';
        c = getchar();
    }
    return x*f;
}
const double eps = 1e-9;
const int maxn = 1010;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
int N,M,K;
const int a[4][2] = {0,1,0,-1,1,0,-1,0};
char MAP[maxn][maxn];
char MAP2[maxn][maxn];
bool vis[maxn][maxn];
struct node{
    int x,y,num;
    node(int x,int y,int num):x(x),y(y),num(num){}
};
bool check(node a){
    return 1 <= a.x && a.x <= N && 1 <= a.y && a.y <= M && MAP[a.x][a.y] == '.' && !vis[a.x][a.y];
}
void BFS(){
    queue<node>Q;
    Q.push(node(1,1,0));
    vis[1][1] = 1;
    while(!Q.empty()){
        node u = Q.front(); Q.pop();
        if(u.num == K){
            printf("%d %d\n",u.x,u.y);
            return;
        }
        for(int i = 0; i < 4; i ++){
            node h = node(u.x + a[i][0],u.y + a[i][1],u.num + 1);
            if(!check(h)) continue;
            Q.push(h);
            vis[h.x][h.y] = 1;
        }
    }
}
int main(){
    Sca3(N,M,K);
    int ans = 0;
    for(int i = 1; i <= N ; i ++){
        for(int j = 1; j <= M ; j ++){
            if(i & 1){
                 MAP[i][j] = '.';
                 ans++;
            }
            else MAP[i][j] = 'x';
        }
    }
    for(int i = 2; i <= N ;i += 4){
        MAP[i][M] = '.';
        ans++;
    }
    for(int i = 4; i <= N; i += 4){
        MAP[i][1] = '.';
        ans++;
    }
    for(int i = 1; i <= M ; i ++){
        for(int j = 1; j <= N ; j ++){
            if(i & 1){
                MAP2[j][i] = '.';
                ans--;
            }
            else MAP2[j][i] = 'x';
        }
    }
    for(int i = 2; i <= M ; i += 4){
        MAP2[N][i] = '.';
        ans--;
    }
    for(int i = 4; i <= M ; i += 4){
        MAP2[1][i] = '.';
        ans--;
    }
    if(ans < 0){
        For(i,1,N) For(j,1,M) MAP[i][j] = MAP2[i][j];
    }
    printf("1 1\n");
    BFS();
    for(int i = 1; i <= N ; i ++){
        for(int j = 1; j <= M ; j++){
            printf("%c",MAP[i][j]);
        }
        puts("");
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starzkg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值