2017安徽ACM省賽F題解
阿新 • • 發佈:2019-02-06
//思路:在外圍加一層點,然後進行dfs遍歷
#include <stdio.h> #include <string.h> using namespace std; char str[500][500]; char str1[500][500]; int vis[500][500]; int m,n; void dfs(int i,int j) { if(i>m+1||j>n+1||i<0||j<0) return; vis[i][j]=1; if(!vis[i+1][j]) dfs(i+1,j); if(!vis[i-1][j]) dfs(i-1,j); if(!vis[i][j+1]) dfs(i,j+1); if(!vis[i][j-1]) dfs(i,j-1); } int fun() { for(int i=0;i<=m+1;i++) { for(int j=0;j<=n+1;j++) { if(!vis[i][j]) return 0; } } return 1; } int main() { int T,t; scanf("%d",&T); for(t=1;t<=T;t++) { memset(vis,0,sizeof(vis)); scanf("%d %d",&m,&n); for(int i=1;i<=m;i++) { scanf("%s",str1[i]); } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { str[i][j]=str1[i][j-1]; } } // for(int i=1;i<=m;i++) // { // for(int j=1;j<=n;j++) // { // printf("%c",str[i][j]); // } // printf("\n"); // } for(int i=0;i<=m+1;i++) { str[i][0]='.'; str[i][n+1]='.'; } for(int j=0;j<=n+1;j++) { str[0][j]='.'; str[m+1][j]='.'; } for(int i=0;i<=m+1;i++) { for(int j=0;j<=n+1;j++) { if(str[i][j]=='#') vis[i][j]=1; // printf("%c",str[i][j]); } // printf("\n"); } dfs(0,0); int sign=fun(); if(sign) printf("Case %d: H\n",t); else printf("Case %d: A\n",t); // for(int i=0;i<=m+1;i++) // { // for(int j=0;j<=n+1;j++) // { // printf("%d",vis[i][j]); // } // printf("\n"); // } } return 0; }