摘要

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

题意

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

题解

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

代码

1026.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<string>
  3. #include<iostream>
  4. using namespace std;
  5. const int dirX[4]={-1,1,0,0},dirY[4]={0,0,-1,1};
  6. int R,C,N,ii,ij,d[3000]={};
  7. char Map[1000][1000]={};
  8. bool dp[100][100][2000]={};
  9. const bool inReg(const int &i,const int &j)
  10. {
  11. if(i<=0||i>R||j<=0||j>C)
  12. return 0;
  13. return 1;
  14. }
  15.  
  16. void dfs(const int &i,const int &j,const int &dir)
  17. {
  18. if(dp[i][j][dir])
  19. return;
  20. dp[i][j][dir]=1;
  21. if(dir==N+1)
  22. {
  23. Map[i][j]='*';
  24. return;
  25. }
  26. for(int s=1;1;++s)
  27. {
  28. int newI=i+dirX[d[dir]]*s,newJ=j+dirY[d[dir]]*s;
  29. if(!inReg(newI,newJ))
  30. return;
  31. if(Map[newI][newJ]=='X')
  32. return;
  33. dfs(newI,newJ,dir+1);
  34. }
  35. }
  36.  
  37. int main()
  38. {
  39. cin>>R>>C;
  40. for(int i=1;i<=R;++i)
  41. for(int j=1;j<=C;++j)
  42. {
  43. cin>>Map[i][j];
  44. if(Map[i][j]=='*')
  45. ii=i,
  46. ij=j,
  47. Map[i][j]='.';
  48. }
  49. cin>>N;
  50. for(int i=1;i<=N;++i)
  51. {
  52. string p;
  53. cin>>p;
  54. if(p=="NORTH")
  55. d[i]=0;
  56. else if (p=="SOUTH")
  57. d[i]=1;
  58. else if (p=="WEST")
  59. d[i]=2;
  60. else
  61. d[i]=3;
  62. }
  63. dfs(ii,ij,1);
  64. for(int i=1;i<=R;++i)
  65. {
  66. for(int j=1;j<=C;++j)
  67. cout<<Map[i][j];
  68. cout<<endl;
  69. }
  70. //cin>>N;
  71. }
  72.  
  73.  

著作权声明[编辑]

关于[编辑]