链接:http://cerberus.delos.com:791/usacoprob2?S=snail&a=uzElkgTaI9d

描述:有障碍的棋盘上的搜索,求从左上角出发最多经过多少个格子。

思路:暴搜

我的实现:

  1 /*
2 ID:zhangyi20
3 PROG:snail
4 LANG:C++
5 */
6 #include <iostream>
7 #include <cstdio>
8 #include <cmath>
9 using namespace std;
10 #define MaxN 120
11 int N,B;
12 int mat[MaxN+5][MaxN+5];//0空地 1障碍 2走过
13 int Dfs(int i,int j,int Dir)//方向:0向上,1向右,2向下,3向左
14 {
15 mat[i][j]=2;
16 int Ret=0,i_=i,j_=j;
17 int tmp1=-1,tmp2=-1;
18 if(Dir==0)//向上
19 {
20 for(i=i-1; ;--i,++Ret)
21 {
22 if(mat[i][j])
23 break;
24 mat[i][j]=2;
25 }
26 if(mat[i][j]==1)//转向
27 {
28 if(mat[i+1][j-1])
29 tmp1=0;
30 else
31 tmp1=Dfs(i+1,j,3);
32 if(mat[i+1][j+1])
33 tmp2=0;
34 else
35 tmp2=Dfs(i+1,j,1);
36 Ret+=max(tmp1,tmp2);
37 }
38 for(i=i+1;i<=i_;++i)
39 mat[i][j]=0;
40 }
41 else if(Dir==1)//向右
42 {
43 for(j=j+1; ;++j,++Ret)
44 {
45 if(mat[i][j])
46 break;
47 mat[i][j]=2;
48 }
49 if(mat[i][j]==1)//转向
50 {
51 if(mat[i-1][j-1])
52 tmp1=0;
53 else
54 tmp1=Dfs(i,j-1,0);
55 if(mat[i+1][j-1])
56 tmp2=0;
57 else
58 tmp2=Dfs(i,j-1,2);
59 Ret+=max(tmp1,tmp2);
60 }
61 for(j=j-1;j>=j_;--j)
62 mat[i][j]=0;
63 }
64 else if(Dir==2)//向下
65 {
66 for(i=i+1; ;++i,++Ret)
67 {
68 if(mat[i][j])
69 break;
70 mat[i][j]=2;
71 }
72 if(mat[i][j]==1)//转向
73 {
74 if(mat[i-1][j-1])
75 tmp1=0;
76 else
77 tmp1=Dfs(i-1,j,3);
78 if(mat[i-1][j+1])
79 tmp2=0;
80 else
81 tmp2=Dfs(i-1,j,1);
82 Ret+=max(tmp1,tmp2);
83 }
84 for(i=i-1;i>=i_;--i)
85 mat[i][j]=0;
86 }
87 else//向左
88 {
89 for(j=j-1; ;--j,++Ret)
90 {
91 if(mat[i][j])
92 break;
93 mat[i][j]=2;
94 }
95 if(mat[i][j]==1)//转向
96 {
97 if(mat[i-1][j+1])
98 tmp1=0;
99 else
100 tmp1=Dfs(i,j+1,0);
101 if(mat[i+1][j+1])
102 tmp2=0;
103 else
104 tmp2=Dfs(i,j+1,2);
105 Ret+=max(tmp1,tmp2);
106 }
107 for(j=j+1;j<=j_;++j)
108 mat[i][j]=0;
109 }
110 return Ret;
111 }
112 int main()
113 {
114 freopen("snail.in","r",stdin);
115 freopen("snail.out","w",stdout);
116 scanf("%d%d",&N,&B);
117 int i,j;
118 char c;
119 for(i=1;i<=B;++i)
120 {
121 do
122 {
123 scanf("%c",&c);
124 }while(c<'A'||c>'Z');
125 scanf("%d",&j);
126 mat[j][c-'A'+1]=1;
127 }
128 for(i=1;i<=N;++i)
129 mat[0][i]=mat[N+1][i]=mat[i][0]=mat[i][N+1]=1;//给地图四周打上障碍
130 mat[1][1]=2;
131 printf("%d\n",max(Dfs(1,1,1),Dfs(1,1,2))+1);
132 return 0;
133 }

最新文章

  1. MVC 5使用TempData(对象)跨视图传递数据
  2. iOS开发UI篇—Quartz2D使用(图片剪切)
  3. Redis教程(七):Key操作命令详解
  4. jenkins password reset,and git integration
  5. Eclipse Java 开发平台实用技巧
  6. [bzoj 3226]校门外的区间
  7. 无法打开SQL Server的连接
  8. XC图片浏览器
  9. hadoop单线程实现server多socket连接读取数据原理分析
  10. nginix 笔记
  11. 使用Boost.Asio编写通信程序
  12. Mono 4 和Jexus 5.6
  13. 如何从零开始对接第三方登录(Java版):QQ登录和微博登录
  14. Leetcode_125_Valid Palindrome
  15. AtCoder Grand Contest 012
  16. vue中html页面写入$t(‘’)怎么显示
  17. lambda创建匿名函数
  18. MD5在线加密的应用
  19. 使用libvirtAPI打快照原理
  20. Bash Shell 注释多行的几种方法(转)

热门文章

  1. Go语言测试:testing
  2. Java集合-LinkedList源码分析
  3. Android 12(S) 图形显示系统 - 基本概念(一)
  4. Kubernetes&amp;Docker集群部署
  5. 与Elasticsearch交互的客户端
  6. C# 在PDF文档中应用多种不同字体
  7. golang中的标准库template
  8. 清除git中缓存的凭证(用户名及密码)
  9. linux计划任务之at
  10. java中的静态变量,静态方法与静态代码块详解