摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 失误原因(初次提交分数)
逃跑的拉尔夫 ★☆☆☆☆ 答案正确 100 2014/12/04 23:13:53 超时(30)

题意

有一些点不可以走的二维地图上,汽车能向四个方向移动,给出移动方向序列(不包括距离),求最终可能停在的点集。

题解

  • 直接深搜了,没有优化T掉30分,很明显N很大,因此加个判重会优化很多,就A了。

代码

1026.cpp代码已折叠
展开折叠内容
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
const int dirX[4]={-1,1,0,0},dirY[4]={0,0,-1,1};
int R,C,N,ii,ij,d[3000]={};
char Map[1000][1000]={};
bool dp[100][100][2000]={};
const bool inReg(const int &i,const int &j)
{
    if(i<=0||i>R||j<=0||j>C)
        return 0;
    return 1;
}

void dfs(const int &i,const int &j,const int &dir)
{
    if(dp[i][j][dir])
        return;
    dp[i][j][dir]=1;
    if(dir==N+1)
    {
        Map[i][j]='*';
        return;
    }
    for(int s=1;1;++s)
    {
        int newI=i+dirX[d[dir]]*s,newJ=j+dirY[d[dir]]*s;
        if(!inReg(newI,newJ))
            return;
        if(Map[newI][newJ]=='X')
            return;
        dfs(newI,newJ,dir+1);
    }
}

int main()
{
    cin>>R>>C;
    for(int i=1;i<=R;++i)
        for(int j=1;j<=C;++j)
        {
            cin>>Map[i][j];
            if(Map[i][j]=='*')
                ii=i,
                ij=j,
                Map[i][j]='.';
        }
    cin>>N;
    for(int i=1;i<=N;++i)
    {
        string p;
        cin>>p;
        if(p=="NORTH")
            d[i]=0;
        else if (p=="SOUTH")
            d[i]=1;
        else if (p=="WEST")
            d[i]=2;
        else
            d[i]=3;
    }
    dfs(ii,ij,1);
    for(int i=1;i<=R;++i)
    {
        for(int j=1;j<=C;++j)
            cout<<Map[i][j];
        cout<<endl;
    }
   //cin>>N;
}


著作权声明[编辑]

关于[编辑]