Codeforces 374 C Inna and Dima (DFS)

Inna and Dima

题意:从图上的任意一个D点按着DIMADIMA的顺序走,问一共可以经过多少个DIMA,如果经过0个DIMA就输出“Pool DIma!“,如果可以有无数多个DIMA就输出”Pool Inna!",否则就输出个数。

题解:DFS搜索就好了,这里我刚开的时候思考的是每次从不同的D点是给每个点标记都不同,然后会遇到从一个D点走的不同路并且不产生环的时候无法检查(菜死我了),后面发现如果产生环的时候,4个环的转弯点是方向是一定的,所以只要每次进行dfs的时候标记一下,从这个点退出的时候就把标记清空,这样如果遇到一个标记点就说明有环了。然后还有一个小bug找了半天,就是计数的时候提早一位计数了,没想到cf上只有一个点卡主了,最后自己测了好多次数据才反应过来。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char str[1000+5][1005];
 4 bool vis[1000+5][1000+5];
 5 int cnt[1000+5][1000+5];
 6 string DIMA = "DIMA";
 7 int dx[4] = {1,-1,0,0};
 8 int dy[4] = {0,0,1,-1};
 9 bool endless = 0;
10 void dfs(int x, int y, int n)
11 {
12     if(endless) return ;
13     n = (n+1)%4;
14     int num = 0;
15     for(int i = 0; i <= 3; i++)
16     {
17         int x1 = x + dx[i];
18         int y1 = y + dy[i];
19         if(str[x1][y1] == DIMA[n]) //懒到不想判断边界,打死也不相信外面会有DIMA
20         {                          
21             if(vis[x1][y1])
22             {
23                 endless = 1;
24                 return ;
25             }
26             else if(!cnt[x1][y1])
27             {
28                 vis[x1][y1] = 1;
29                 dfs(x1,y1,n);
30                 num = max(num, cnt[x1][y1]);
31                 vis[x1][y1] = 0;
32             }
33             else num = max(num, cnt[x1][y1]);
34         }
35     }
36     if(!cnt[x][y] &&n == 0) num++; // 这里的n代表的是下一个”DIMA“的下标
37     cnt[x][y] = num;               //当n变成0了之后其实就代表着这一位是A
38     return ;
39 }
40 int main()
41 {
42     int n, m;
43     scanf("%d%d",&n,&m);
44     memset(vis, 0, sizeof(vis));
45     memset(cnt, 0, sizeof(cnt));
46     memset(str, 0, sizeof(str));
47     for(int i = 1; i <= n; i++)
48         scanf("%s", str[i]+1);
49     int ans = 0;
50     for(int i = 1; i <= n; i++)
51     {
52         for(int j = 1; j <= m; j++)
53             if(str[i][j] == 'D' && !cnt[i][j])
54             {
55                 dfs(i, j, 0);
56                 ans = max(ans,cnt[i][j]);
57             }
58     }
59     /*for(int i = 1; i <= n; i++)
60         for(int j = 1; j <= m; j++)
61             printf("%d%c",cnt[i][j]," 
"[j==m]);*/
62     if(endless) printf("Poor Inna!
");
63     else if(ans == 0) printf("Poor Dima!
");
64     else printf("%d", ans);
65     return 0;
66 }
67 /*
68 5 5
69 DIMAD
70 DDDDI
71 DDDIM
72 DDDMA
73 DDDAD
74 */
原文地址:https://www.cnblogs.com/MingSD/p/8424086.html