vs做网站各种控件的使用,免费wordpress资源,外贸网站建站系统,夏天做那些网站能致富PS#xff1a;以前看到题目这么长就没写下去了。今天做了半天#xff0c;没做出来。准备看题解#xff0c;打开了网站都忍住了#xff0c;最后还是靠自己做出来的。算是一点进步吧。 分析#xff1a; 题目的意思没明白或者理解有偏差都没办法做题。看样例3和样例4#xf… PS以前看到题目这么长就没写下去了。今天做了半天没做出来。准备看题解打开了网站都忍住了最后还是靠自己做出来的。算是一点进步吧。 分析 题目的意思没明白或者理解有偏差都没办法做题。看样例3和样例4数据差不多的但是一个输出4但是另外的一个却是-1。再去看题目就会发现题目的意思是在撞碎石头之前必须走一个为值0的格子。我理解为需要加速。对样例4答案4是这样出来的初始位置为13第一步是到达12并且使得11点的值为0撞碎了这里的石头0代表可以通行第二步是到达13并且是得14点的值为0第三步是到达14并且使得15的值为0第四步是到达15发现到达了终点结束。样例5也可以这样得到。 样例6错误的原因是因为超过了10步这是题目的要求超过10步就当不能到达处理。 这样一来可以知道了起点和终点的处理了。起点终点的坐标记录下来但是标记为0。 还有就是实现如何对一个方向进行搜索以及如何标记在撞石头之前已经走过0的位置不能是这种情况起点是0下一点就撞石头。这思考一下就可以实现了。 1 #includeiostream2 #includecstdio3 #includecstring4 #includealgorithm5 using namespace std;6 7 void DFS(int x,int y,int di);8 const int N22,INF0x3f3f3f3f;9 bool vis[N][N];
10 int r,c,t,ex,ey,sx,sy,mx;
11 int dx[4]{0,0,1,-1};
12 int dy[4]{1,-1,0,0};
13 bool isin(int x,int y)
14 {
15 return x0xry0yc;
16 }
17 void DDFS(int a,int b,int x,int y,int d)
18 {
19 int i,j;
20 if(t10) return ;
21 ixa; jyb;
22 if(!isin(i,j)) return ;
23 if(!vis[i][j])
24 {
25 d1;
26 if(iexjey)
27 {
28 mxmin(t,mx);
29 }
30 DDFS(a,b,i,j,d);
31 }
32 else if(vis[i][j]d)
33 {
34 vis[i][j]0;
35 d0;
36 t;
37 DFS(x,y,d);
38 t--;
39 vis[i][j]1;
40 }
41 }
42 void DFS(int x,int y,int d)
43 {
44
45 for(int k0;k4;k)
46 {
47 DDFS(dx[k],dy[k],x,y,d);
48 }
49 }
50 int main()
51 {
52 //freopen(test.txt,r,stdin);
53 while(scanf(%d%d,c,r)!EOFc)
54 {
55 int x;
56 for(int i0;ir;i){
57 for(int j0;jc;j){
58 scanf(%d,x);
59 if(x3)
60 {
61 exi;eyj;
62 vis[i][j]0;
63 }
64 else if(x2)
65 {
66 sxi;syj;
67 vis[i][j]0;
68 }
69 else vis[i][j]x;
70 }
71 }
72 t1;
73 mxINF;
74 DFS(sx,sy,0);
75 if(mxINF) printf(-1\n);
76 else printf(%d\n,mx);
77 }
78 return 0;
79 } View Code DFS(x,y,d) (x,y)是起点的坐标d是标记是否有经过被标记0的点。1表示经过了0表示没有。 DDFS(a,b,x,y,d) (a,b)是方向向量表明向什么方向搜索x,y,d同上。 通过d的记录就可以知道石头可不可以撞碎。使用(a,b)就可以沿着同一方向一直深入。 转载于:https://www.cnblogs.com/Potato-lover/p/4114002.html