【codevs 1026】逃跑的拉尔夫

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Loi_Shirley/article/details/52699412

1026 逃跑的拉尔夫
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。

那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。

编写程序,通过使用一张小镇的地图帮助警察局找到那辆车。程序必须能表示出该车最终所有可能的位置。

小镇的地图是矩形的,上面的符号用来标明哪儿可以行车哪儿不行。“.”表示小镇上那块地方是可以行车的,而符号“X”表示此处不能行车。拉尔夫所开小车的初始位置用字符的“*”表示,且汽车能从初始位置通过。

汽车能向四个方向移动:向北(向上),向南(向下),向西(向左),向东(向右)。

拉尔夫所开小车的行动路线是通过一组给定的方向来描述的。在每个给定的方向,拉尔夫驾驶小车通过小镇上一个或更多的可行车地点。

输入描述 Input Description
输入文件的第一行包含两个用空格隔开的自然数R和C,1≤R≤50,1≤C≤50,分别表示小镇地图中的行数和列数。

以下的R行中每行都包含一组C个符号(“.”或“X”或“*”)用来描述地图上相应的部位。

接下来的第R+2行包含一个自然数N,1≤N≤1000,表示一组方向的长度。

接下来的N行幅行包含下述单词中的任一个:NORTH(北)、SOUTH(南)、WEST(西)和EAST(东),表示汽车移动的方向,任何两个连续的方向都不相同。

输出描述 Output Description
输出文件应包含用R行表示的小镇的地图(象输入文件中一样),字符“*”应该仅用来表示汽车最终可能出现的位置。

样例输入 Sample Input
4 5

…..

.X…

…*X

X.X..

3

NORTH

WEST

SOUTH

样例输出 Sample Output
…..

X..

..X

X.X..

数据范围及提示 Data Size & Hint

模拟……
搜索……
好吧怎么叫都行

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 55;
string s;//操作
int x,y,n;//起点
char z,maps[MAXN][MAXN];//答案
int r,c,map[MAXN][MAXN];//转化 
// 可通过为 1,不可通过为 0,现在可到为 3,起点特殊标记;
bool viv[MAXN][MAXN]; 

void work(char k)
{
    memset(viv,0,sizeof(viv));
    if(k == 'N')
    {
        for(int i = 1; i <= r; i ++)
        {
            for(int j = 1; j <= c; j ++)
            {
                if(map[i][j] == 3)
                {
                    for(int t = i - 1; t > 0; t --)
                    {
                        if(map[t][j])
                            map[t][j] = 3,viv[t][j] = true;
                        else    break;
                    }
                    if(!viv[i][j])  viv[i][j] = true;   
                }
            }
        }   
    }
    else if(k == 'W')
    {
        for(int i = 1; i <= r; i ++)
        {
            for(int j = 1; j <= c; j ++)
            {
                if(map[i][j] == 3)
                {
                    for(int t = j - 1; t > 0; t --)
                    {
                        if(map[i][t])
                            map[i][t] = 3,viv[i][t] = true;
                        else    break;
                    }
                    if(!viv[i][j])  viv[i][j] = true;   
                }
            }
        }   
    }
    else if(k == 'S')
    {
        for(int i = 1; i <= r; i ++)
        {
            for(int j = 1; j <= c; j ++)
            {
                if(map[i][j] == 3)
                {
                    for(int t = i + 1; t <= r; t ++)
                    {
                        if(map[t][j])
                            map[t][j] = 3,viv[t][j] = true;
                        else    break;
                    }
                    if(!viv[i][j])  viv[i][j] = true;   
                }
            }
        }   
    }
    else if(k == 'E')
    {
        for(int i = 1; i <= r; i ++)
        {
            for(int j = 1; j <= c; j ++)
            {
                if(map[i][j] == 3)
                {
                    for(int t = j + 1; j <= c; j ++)
                    {
                        if(map[i][t])
                            map[i][t] = 3,viv[i][t] = true;
                        else    break;
                    }
                    if(!viv[i][j])  viv[i][j] = true;   
                }
            }
        }   
    }
    return;
}

void change_char(int a,int b,char k)
{
    if(k == '.')    
    {
        map[a][b] = 1;
        return;
    }
    else if(k == 'X')
    {
        map[a][b] = 0;
        return;
    }
    else if(k == '*')
    {
        map[a][b] = 3;
        x = a,y = b;
        return;
    }
}

void change_int(int a,int b,int k)
{
    if(b == 0)
    {
        maps[a][b] = 'X';
        return;
    }
    else if(b == 1)
    {
        maps[a][b] = '.';
        return;
    }
    else if(b == 1)
    {
        maps[a][b] = '*';
        return;
    }
}

int main()
{
    scanf("%d %d",&r,&c);
    for(int i = 1; i <= r; i ++)
        for(int j = 1; j <= c; j ++)
            cin >> z,change_char(i,j,z);
    scanf("%d",&n);
    for(int i = 1; i <= n; i ++)
        cin >> s,work(s[0]);
    for(int i = 1; i <= r; i ++)
        for(int j = 1; j <= c; j ++)
            change_int(i,j,map[i][j]);
    for(int i = 1; i <= r; i ++)
    {
        for(int j = 1; j <= c; j ++)
            cout << maps[i][j];
        puts("");
    }
    return 0;   
}

这个相比之下简单一点

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int dx[] = {-1,1,0,-1};
int dy[] = {1,0,-1,0};
string s;
vector < int > v;
int n,m,t,xx,yy,num[55][55];
bool used[55][55];
char ss[55][55];

void dms(int x){
//上北下南左西右东  
    memset(used,0,sizeof(used));//!!!!!!!!!!!!!
    if(x == 0){//x-1,y
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= m; j ++)
                if(num[i][j] == 3){
                    for(int k = i - 1; k >= 1; k --){
                        if(num[k][j]) num[k][j] = 3,used[k][j] = true;
                        else break;
                    }
                if(!used[i][j]) num[i][j] = 1;}
    }
    else if(x == 1){//x+1,y
        for(int i = 1; i <= n; i ++)
                for(int j = 1; j <= m; j ++)
                    if(num[i][j] == 3){
                        for(int k = i + 1; k <= n; k ++){
                            if(num[k][j]) num[k][j] = 3,used[k][j] = true;
                            else break;
                        }
                if(!used[i][j]) num[i][j] = 1;}
    }
    else if(x == 2){//x,y-1
        for(int i = 1; i <= n; i ++)
                for(int j = 1; j <= m; j ++)
                    if(num[i][j] == 3){
                        for(int k = j - 1; k >= 1; k --){
                            if(num[i][k]) num[i][k] = 3,used[i][k] = true;
                            else break;
                        }
                    if(!used[i][j]) num[i][j] = 1;}
    }
    else if(x == 3){//x,y+1
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= m; j ++)
                if(num[i][j] == 3){
                    for(int k = j + 1; k <= m; k ++){
                        if(num[i][k]) num[i][k] = 3,used[i][k] = true;
                        else break;
                    }
                if(!used[i][j]) num[i][j] = 1;}
    }
    return;
}

int main(){
    memset(num,0,sizeof(num));
    memset(used,0,sizeof(used));
    scanf("%d %d",&n,&m);
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++){
            cin >> ss[i][j];
            if(ss[i][j] == '.')         num[i][j] = 1;
            else if(ss[i][j] == 'X')    num[i][j] = 0;
            else if(ss[i][j] == '*')    num[i][j] = 3,xx = i,yy = j;
        }
    scanf("%d",&t);
    for(int i = 1; i <= t; i ++){
        cin >> s;
        if(s == "NORTH")        v.push_back(0);
        else if(s == "SOUTH")   v.push_back(1);
        else if(s == "WEST")    v.push_back(2);
        else if(s == "EAST")    v.push_back(3);
    }
    for(int i = 0; i < t; i ++) dms(v[i]);
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++){
            if(num[i][j] == 1) ss[i][j] = '.';
            else if(num[i][j] == 0) ss[i][j] = 'X';
            else if(num[i][j] == 3) ss[i][j] = '*';
            cout << ss[i][j];
            if(j == m) puts("");
        }
    return 0;
}
展开阅读全文

没有更多推荐了,返回首页