啊~~洛谷AT319 3Match WA 啦 orz ~ hellp!

题目连接:
https://www.luogu.com.cn/problem/AT319

code:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int k;
char a[1000][1000];
int ans=0;
int flag;
void dfs(int x,int y,char ss,int fangxiang) {
//fangxiang:记录是从什么方向爬到当前位置的,fangxiang=1,由上方或下方爬来的;fangxiang=2,由左方或右方爬来的; 
    a[x][y]='t';
    k++;
    if(a[x+1][y]==ss&&x+1<=n) {//如果方向不同则 flag++ 
        if(fangxiang==1)
            flag++;
        dfs(x+1,y,ss,2);
    }
    if(a[x-1][y]==ss&&x+1>=1) {
        if(fangxiang==1)
            flag++;
        dfs(x-1,y,ss,2);
    }
    if(a[x][y+1]==ss&&y+1<=m) {
        if(fangxiang==2)
            flag++;
        dfs(x,y+1,ss,1);
    }
    if(a[x][y-1]==ss&&y-1>=1) {
        if(fangxiang==2)
            flag++;
        dfs(x,y-1,ss,1);
    }
}
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            cin>>a[i][j];
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) {
            k=0;
            flag=0;
            if(a[i][j]!='t')
                dfs(i,j,a[i][j],0);
            if(k>=3) {
                if((k==3&&flag>=1)||(k==4&&flag>=2))
//          如果长度==3,且转过1次向      或      如果长度==4,且转过2次向 , 跳出 
                    break;
                else
                    ans++;
            }
//            cout<<"\n";
//            for(int i=1; i<=n; i++) {
//                for(int j=1; j<=m; j++)
//                    cout<<a[i][j];
//                cout<<"\n";
//            }
        }


    printf("%d",ans);
    return 0;
}

又写了个代码,还是WA了 555555555~~

#include<bits/stdc++.h>
using namespace std;
int n,m;
int k;
char a[1000][1000];
int ans=0;
int flag;
void dfs(int x,int y,char ss,int fangxiang) {
//fangxiang:记录是从什么方向爬到当前位置的,fangxiang=1,由上方或下方爬来的;fangxiang=2,由左方或右方爬来的; 
    a[x][y]='t';
    k++;
    int uu=0,u=0;
    if(a[x+1][y]==ss&&x+1<=n) {//如果方向不同则 flag++ 
        if(fangxiang==1)
            flag++;
        u++;
        dfs(x+1,y,ss,2);
    }
    if(a[x-1][y]==ss&&x+1>=1) {
        if(fangxiang==1)
            flag++;
        u++;
        dfs(x-1,y,ss,2);
    }
    if(a[x][y+1]==ss&&y+1<=m) {
        if(fangxiang==2)
            flag++;
        uu++;
        dfs(x,y+1,ss,1);
    }
    if(a[x][y-1]==ss&&y-1>=1) {
        if(fangxiang==2)
            flag++;
        uu++;
        dfs(x,y-1,ss,1);
    }
    if(uu&&u)
       flag++;
}
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            cin>>a[i][j];
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++) {
            k=0;
            flag=0;
            if(a[i][j]!='t')
                dfs(i,j,a[i][j],0);
            if(k>=3) {
                if((k==3&&flag>=1)||(k==4&&flag>=2))
//          如果长度==3,且转过1次向      或      如果长度==4,且转过2次向 , 跳出 
                    break;
                else
                    ans++;
            }
//            cout<<"\n";
//            for(int i=1; i<=n; i++) {
//                for(int j=1; j<=m; j++)
//                    cout<<a[i][j];
//                cout<<"\n";
//            }
//            cout<<ans<<endl; 
        }


    printf("%d",ans);
    return 0;
}
//4 5
//1 1 2 8 8
//1 5 5 8 8
//7 0 5 5 9
//7 7 0 9 9
//1 
//此代码能过这个点 

直接贴题目吧