#include<stdio.h>
#include<string.h>
const int maxn=320;
char ch[maxn][maxn];
int dis[maxn][maxn];
int n,m;
int d[4][2]={1,0,-1,0,0,1,0,-1};
int D(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&dis[x][y]==0&&ch[x][y]!='#')
return 1;
return 0;
}
int cnt=0;
void dfs(int x,int y)
{
if(D(x,y)==0) return ;
cnt++;
dis[x][y]=1;
for(int i=0;i<4;i++)
{
int xx=x+d[i][0];
int yy=y+d[i][1];
dfs(xx,yy);
}
}
int main()
{
while(~scanf("%d %d",&m,&n)&&(m||n))
{
int x1,y1;
cnt=0;
memset(dis,0,sizeof(dis));
for(int i=0;i<n;i++)
scanf("%s",ch[i]);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(ch[i][j]=='@')
{
x1=i;y1=j;break;
}
}
}
dfs(x1,y1);
printf("%d\n",cnt);
}
return 0;
}
int check(参数)
{
if(满足条件)
return 1;
return 0;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到)
}
}
void dfs()
{
if() {
return;
}
for(i=0; i<n; i++){
if () {
dfs();
}
}
```c
#include<stdio.h>
#include<string.h>
int n;
char a[15];
char re[15];
int vis[15];
void dfs(int step)
{
int i;
if(step==n+1)
{
for(i=1;i<=n;i++)
printf("%c",re[i]);
printf("\n");
return ;
}
for(i=1;i<=n;i++)
{
if(vis[i]==0)
{
re[step]=a[i];
vis[i]=1;
dfs(step+1);
vis[i]=0;
}
}
return ;
}
int main(void)
{
int T;
scanf("%d",&T);
getchar();
while(T--)
{
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
scanf("%s",a+1);
n=strlen(a+1);
dfs(1);
}
return 0;
}