第四届上海理工大学程序设计全国挑战赛---昨日方舟

发布于:2024-05-13 ⋅ 阅读:(141) ⋅ 点赞:(0)

知识点:模拟
 

题目描述

《昨日方舟》是一款塔防类游戏。在游戏中,我们要通过部署角色来抵御怪物的入侵。在这款游戏中,有一名角色名字为 “今”,他的能力为能够在地图上部署小蛇,小蛇在某些条件下可以与其他小蛇合体,成为大蛇,大蛇不能再与其他小蛇或大蛇合成。

现在有一个大小为 nnn 行 mmm 列的地图,自上往下分别为第 111 行……第 nnn 行,自左往右为第 111 列……第 mmm 列。格子分为可部署格和不可部署格。小蛇只能部署在可部署格上,并且小蛇在部署时,会有一个确定的朝向。

大蛇的合成规则如下:

1. 若当前部署的小蛇所面向的相邻格子中存在另一条小蛇,则当前部署的小蛇消失,面向的小蛇变成大蛇,朝向不变(与原来的小蛇一致)。
2. 若 1 中情况不满足,但存在已经部署的其他小蛇面向当前部署的格子,且与当前部署的格子相邻,那么这些小蛇中最后一条部署的小蛇消失,当前部署的小蛇变成大蛇,朝向与当前部署小蛇一致。
现在给定 n×mn \times mn×m 的地图的每个格子的可部署情况,以及无限只待部署的小蛇,初始状态下地图中不存在小蛇与大蛇,并且按照时间顺序给定 kkk 次尝试部署小蛇的位置和朝向(可能尝试部署在其他小蛇,大蛇和不可部署位置上,此时视作部署失败,不会发生任何事),请输出最后地图上的小蛇与大蛇的存在情况。

输入描述:


输入第 111 行包含 333 个用空格分隔的正整数 n,m,kn, m, kn,m,k ,代表地图的大小与尝试部署的次数。(1≤n,m≤103, 1≤k≤2×105)(1 \leq n,m \leq 10^3,\ 1 \leq k \leq 2\times 10 ^ 5 )(1≤n,m≤103, 1≤k≤2×105)

接下来 nnn 行每行有 mmm 个用空格分隔的整数,第 iii 行第 jjj 个整数代表了地图中第 iii 行第 jjj 列格子的可部署情况,“0” 代表不可部署格,“1” 代表可部署格子。

最后 kkk 行,每行包含 222 个整数 x, yx,\ yx, y 与一个字符 ccc ,第 iii 行表示按照时间顺序,第 iii 次尝试部署的小蛇位置为第 xxx 行第 yyy 列,且朝向为 ccc 。 (1≤x≤n, 1≤y≤m, c∈{u,d,l,r}1 \leq x \leq n,\ 1 \leq y \leq m,\ c \in \{u,d,l,r\}1≤x≤n, 1≤y≤m, c∈{u,d,l,r},u,d,l,ru, d, l, ru,d,l,r 分别代表朝向为上、下、左、右)。

输出描述:

输出 nnn 行,每行包含 mmm 个字符,第 iii 行第 jjj 列的字符 ccc 代表最终地图上第 iii 行第 jjj 列格子的状态。“X” 表示该格为不可部署区域,“O” 表示该格为可部署区域,但不存在小蛇与大蛇部署在该格,“u”, “d”, “l”, “r” 表示该格部署了小蛇,并且朝向为上、下、左、右,“U”, “D”, “L”, “R” 表示该格部署了大蛇,且朝向为上、下、左、右。

示例1

输入

复制2 2 4 1 1 1 1 1 1 r 1 2 l 2 1 l 2 2 r

2 2 4
1 1
1 1
1 1 r
1 2 l
2 1 l
2 2 r

输出

RO
lr

示例2

输入

3 9 12
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 1 1
1 2 d
2 1 r
3 2 u
2 2 r
1 5 d
2 4 r
3 5 u
2 5 d
1 8 d
2 7 r
3 8 u
2 8 r

输出

OdOOdOOdO
rROrOOrXO
OOOOUOOuO
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
char gz[1010][1010];
int dx[]={-1,1,0,0};//上下左右
int dy[]={0,0,-1,1};
int t[1010][1010];
struct ty{
    int x,y,t;  
};
bool cmp(ty a,ty b){
    return a.t>b.t;
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            int a;
            cin>>a;
            if(a) gz[i][j]='O';
            else gz[i][j]='X';
        }
    }
    for(int i=1;i<=k;i++){
        int a,b;
        char c;
        cin>>a>>b>>c;
        if(gz[a][b]!='O') continue;
        t[a][b]=i;
        if(c=='u'){
            int x=dx[0]+a,y=dy[0]+b;
             if(gz[x][y]=='d'||gz[x][y]=='u'||gz[x][y]=='l'||gz[x][y]=='r') {
                if(gz[x][y]=='u') gz[x][y]='U';
                else if(gz[x][y]=='d') gz[x][y]='D';
                else if(gz[x][y]=='l') gz[x][y]='L';
                else if(gz[x][y]=='r') gz[x][y]='R';
                continue;
            }
        }
        else if(c=='d'){
            int x=dx[1]+a,y=dy[1]+b;
             if(gz[x][y]=='d'||gz[x][y]=='u'||gz[x][y]=='l'||gz[x][y]=='r') {
                if(gz[x][y]=='u') gz[x][y]='U';
                else if(gz[x][y]=='d') gz[x][y]='D';
                else if(gz[x][y]=='l') gz[x][y]='L';
                else if(gz[x][y]=='r') gz[x][y]='R';
                continue;
            }
        }
        else if(c=='l'){
            int x=dx[2]+a,y=dy[2]+b;
            //cout<<x<<" "<<y<<" "<<gz[x][y]<<endl;
            if(gz[x][y]=='d'||gz[x][y]=='u'||gz[x][y]=='l'||gz[x][y]=='r') {
                if(gz[x][y]=='u') gz[x][y]='U';
                else if(gz[x][y]=='d') gz[x][y]='D';
                else if(gz[x][y]=='l') gz[x][y]='L';
                else if(gz[x][y]=='r') gz[x][y]='R';
                continue;
            }
        }
        else if(c=='r'){
            int x=dx[3]+a,y=dy[3]+b;
             if(gz[x][y]=='d'||gz[x][y]=='u'||gz[x][y]=='l'||gz[x][y]=='r') {
                if(gz[x][y]=='u') gz[x][y]='U';
                else if(gz[x][y]=='d') gz[x][y]='D';
                else if(gz[x][y]=='l') gz[x][y]='L';
                else if(gz[x][y]=='r') gz[x][y]='R';
                continue;
            }
        }
        vector<ty> v;
        for(int j=0;j<4;j++){
            int x=a+dx[j];
            int y=b+dy[j];
            if(x>n||x<1||y>m||y<1) continue;
            if(j==0&&gz[x][y]=='d') v.push_back({x,y,t[x][y]});
            else if(j==1&&gz[x][y]=='u') v.push_back({x,y,t[x][y]});
            else if(j==2&&gz[x][y]=='r') v.push_back({x,y,t[x][y]});
            else if(j==3&&gz[x][y]=='l') v.push_back({x,y,t[x][y]});
        }
        if(v.size()==0){
            gz[a][b]=c;
            continue;
        }
        sort(v.begin(),v.end(),cmp);
        for(int j=0;j<v.size();j++){
            if(c=='u')gz[a][b]='U';
            else if(c=='d') gz[a][b]='D';
            else if(c=='r') gz[a][b]='R';
            else if(c=='l') gz[a][b]='L';
            gz[v[j].x][v[j].y]='O';
            break;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<gz[i][j];
        }
        cout<<endl;
    }
}

WA的原因:

1.dx和dy数组的上下和左右弄反了,好多次了!!!

2.排序排反了,是最晚放置的,我排成最早了


网站公告

今日签到

点亮在社区的每一天
去签到