还是上次那道BFS联通块问题,望纠正,THANKS!

是这样的,昨天看到某位大_佬回复了我,非常感激!照着他的写法,我换了一种写法,但是出BUG了!望有人可以找出我的错误,谢谢!
题目描述
猪猪学校的草坪是长方形的,地上有的格子铺着草,有些格子则是小花。佩奇站在其中一格草地上,他只能向相邻的铺着草的格子移动,不能走到有小花的格子上。
请编写一个程序,计算佩奇能够到达的格子的数量。

输入格式
共 k+1 行,

第一行是两个整数 n 和 k ,分别表示草地的宽度和高度。

在接下来的 k行中,每行包括 n 个字符。每个字符表示当前格子的植物,规则如下

1).:草地格子;
2)#:鲜花格子;
3)@:草地格子,并且佩奇一开始站在这个格子上,全图只有一个。

输出格式
一个整数,表示佩奇能到达的格子数量(包括一开始的那格)。

样例输入
6 9
....#.
.....#
......
......
......
......
......

.#..#.
样例输出
45
样例分析
如上所述。

数据范围 1≤n,k≤20 。
下面是我的错误代码

#include<bits/stdc++.h>
using namespace std;
const int dx[4]={-1,0,1,0};
const int dy[4]={0,-1,0,1};
const int N=30;
char s[N][N];
int q[1007][2];
int n,m,x,y,sx,sy,nx,ny,cnt=1,h=1,t=0;
int main()
{
    cin>>m>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>s[i][j];
            if(s[i][j]='@')
            {
                sx=i;
                sy=j;
            }
        }
    }
    q[++t][0]=sx;
    q[t][1]=sy;
    s[sx][sy]='#';
    while(h<=t)
    {
        x=q[h][0];
        y=q[h][1];
        h++;
        for(int i=0;i<4;i++)
        {
            nx=x+dx[i];
            ny=y+dy[i];
            if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&s[nx][ny]=='.')
            {
                s[nx][ny]='#';
                q[++t][0]=nx;
                q[t][1]=ny;
                cnt++;
            }
        }
    }
    cout<<cnt;
    return 0;
}