思路:dfs+记忆化搜索
代码:
#include<bits/stdc++.h> using namespace std; #define ll unsigned long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) const int INF=0x3f3f3f3f; char mp[1005][1005]; bool vis[1005][1005]; int dp[1005][1005]; int dir[4][2]={0,1,1,0,0,-1,-1,0}; int n,m; int dfs(int x,int y){ if(dp[x][y]!=-1)return dp[x][y]; dp[x][y]=0;//当前路径染色,方便判环 int ans=0; bool f=false; for(int i=0;i<4;i++){ int tx=x+dir[i][0]; int ty=y+dir[i][1]; if(x<1||x>n||y<1||y>m)continue; if(mp[x][y]=='D'&&mp[tx][ty]=='I'){ if(dp[tx][ty]==0)return INF; ans=max(ans,1+dfs(tx,ty)); f=true; } if(mp[x][y]=='I'&&mp[tx][ty]=='M'){ if(dp[tx][ty]==0)return INF; ans=max(ans,1+dfs(tx,ty)); f=true; } if(mp[x][y]=='M'&&mp[tx][ty]=='A'){ if(dp[tx][ty]==0)return INF; ans=max(ans,1+dfs(tx,ty)); f=true; } if(mp[x][y]=='A'&&mp[tx][ty]=='D'){ if(dp[tx][ty]==0)return INF; ans=max(ans,1+dfs(tx,ty)); f=true; } } if(!f)return dp[x][y]=1; else return dp[x][y]=ans; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>(mp[i]+1); } mem(dp,-1); int ANS=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(mp[i][j]=='D'){ ANS=max(ANS,dfs(i,j)); } } } //cout<<ANS<<endl; if(ANS>=INF)cout<<"Poor Inna!"<<endl; else{ if(ANS/4==0)cout<<"Poor Dima!"<<endl; else cout<<ANS/4<<endl; } return 0; }