2013年10月28日 星期一
[ZJ] a815. 2013高雄市能力競賽高中組 6. 蜜蜂飛行
#include<stdio.h>
#include<string.h>
char s[305][305];
int v[305][305];
int d[6][2]={{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0}};
void dfs(int x,int y,int t,char c){
if(v[x][y]) return;
v[x][y]=t;
int i;
for(i=0;i<6;i++){
if(s[x+d[i][0]][y+d[i][1]]==c)
dfs(x+d[i][0],y+d[i][1],t,c);
}
}
int main(){
int t,n,m,i,j,k,a,b,C=0;
scanf("%d",&t);
while(t--){
C++;
memset(s,0,sizeof(s));
memset(v,0,sizeof(v));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",&s[i][1]);
dfs(1,1,1,'.');
if(v[n][m]!=1){
puts("0");
goto go;
}
for(i=1;i<=n;i++){
if(s[i][1]=='O')
dfs(i,1,2,'O');
if(s[i][m]=='O')
dfs(i,m,3,'O');
}
for(i=1;i<=m;i++){
if(s[1][i]=='O')
dfs(1,i,3,'O');
if(s[n][i]=='O')
dfs(n,i,2,'O');
}
/*for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
printf("%d ",v[i][j]);
puts("");
}*/
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(i==1 && j==1) continue;
if(i==n && j==m) continue;
a=0,b=0;
if(i==1 || j==m) a=1;
for(k=0;k<6;k++)
if(v[i+d[k][0]][j+d[k][1]]==3) a=1;
if(i==n || j==1) b=1;
for(k=0;k<6;k++)
if(v[i+d[k][0]][j+d[k][1]]==2) b=1;
if(a+b==2){
puts("1");
goto go;
}
}
}
puts("2");
go:;
}
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言