题意:从图上的任意一个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 */