• 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 */
  • 相关阅读:
    #18.2.27 codevs1098 均分纸牌
    18.2.26 codevs3143 二叉树的序遍历
    18.2.14 codevs1501 二叉树最大宽度和高度
    18.2.14 codevs1011 数的计算
    18.2.14 【水】codevs1475 m进制转十进制
    18.2.14 【水】codevs1474 十进制转m进制
    18.2.14 【水】codevs1430 素数判定
    18.2.13 codevs1212 最大公约数
    18.2.13 codevs1012 最大公约数和最小公倍数问题
    17.12.31 链表合并
  • 原文地址:https://www.cnblogs.com/MingSD/p/8424086.html
Copyright © 2020-2023  润新知