这道题我用连通块做倒能ac,但确实失去这题意义了,不知道为什么程序有死循环,应该还有点问题。求指教
#include <bits/stdc++.h>
using namespace std;
int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//上下左右
char th[20][20]={'#'};
int dh[20][20]={0};//地图和标记走没走过
int q=1,p=0;//q是输出,p
int w,h;
void dfs(int x,int y);
int main(){
int x,y;
scanf("%d %d",&h,&w);
for(int i=0;i<w;i++){
for(int j=0;j<h;j++){
scanf(" %c",&th[i][j]);
if(th[i][j]=='.'){
x=j;
y=i;
} }}//输入地图,并任选一块‘.’为起点
dh[y][x]=1;
dfs(x,y);
printf("%d",q);
}
void dfs(int x,int y){
if(th[y][x]=='@'){
if(q>p){
p=q;}
return;}//终点返回
for(int i=0;i<4;i++){//选一个方向
int dx=x+next[i][1],dy=y+next[i][0];{
if(dx>=0&&dx<h&&dy>=0&&dy<w&&th[dy][dx]!='#'){
if(dh[dy][dx]==0){
q++;
dh[dy][dx]=1;}
dfs(dx,dy); }
}}
return;
}