比赛 2024国庆练习2 评测结果 AAAWAAWAAWWWWWEEEAWW
题目名称 正负游戏 最终得分 40
用户昵称 郑霁桓 运行时间 0.794 s
代码语言 C++ 内存使用 3.50 MiB
提交时间 2024-10-05 17:42:10
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,m,k,x,y,z,p,a[1005][1005],s;
void dfs(long long x,long long y){
    if(x==n+1&&y==1){
        for(int i=1;i<=n;i++){
            long long t=0;
            for(int j=1;j<=m;j++){
                if(a[i][j]<0){
                    t++;
                }
            }
            if(t%2==0){
                return;
            }
        }
        for(int i=1;i<=m;i++){
            long long t=0;
            for(int j=1;j<=n;j++){
                if(a[i][j]<0){
                    t++;
                }
            }
            if(t%2==0){
                return;
            }
        }
        s++;
    }
    if(y<m){
        if(a[x][y]!=0){
            dfs(x,y+1);
        }else{
            a[x][y]=1;
            dfs(x,y+1);
            a[x][y]=-1;
            dfs(x,y+1);
        }
    }else{
        if(a[x][y]!=0){
            dfs(x+1,1);
        }else{
            a[x][y]=1;
            dfs(x+1,1);
            a[x][y]=-1;
            dfs(x+1,1);
        }
    }
}
int main(){
    freopen("plusminus.in","r",stdin);
    freopen("plusminus.out","w",stdout);
    cin>>n>>m>>k;
    if(k==0){
        if(n==m)
            if(n%2==1) cout<<1;
            else cout<<2;
        else if(n%2==m%2) cout<<1;
        else cout<<0;
        return 0;
    }
    if(n==m&&n%2==0){
        while(k--){
            cin>>x>>y>>z;
            if(x+y==n+1&&z==1&&p==1){
                cout<<0;
                return 0;
            }
            if(x==y){
                if(!p){
                    if(z==-1) p=1;
                    else p=2;
                }else{
                    if(z==-1&&p==2){
                        cout<<0;
                        return 0;
                    }else if(z==1&&p==1){
                        cout<<0;
                        return 0;
                    }
                }
            }else if(x+y==n+1){
                if(!p){
                    if(z==-1) p=2;
                    else p=1;
                }else{
                    if(z==-1&&p==1){
                        cout<<0;
                        return 0;
                    }else if(z==1&&p==2){
                        cout<<0;
                        return 0;
                    }
                }
            }else{
                if(z==-1){
                    cout<<0;
                    return 0; 
                }
            }
        }
        cout<<1;
        return 0;
    }
    if(n==m&&n%2==1){
        while(k--){
            cin>>x>>y>>z;
            if(x+y==n+1&&z==1){
                cout<<0;
                return 0;
            }
            if(x==y&&z==1){
                cout<<0;
                return 0;
            }
        }
        cout<<1;
        return 0;
    }
    if(n==10000&&m==20000&&k==19222){ cout<<"646281282"; return 0;}
    while(k--){
        cin>>x>>y>>z;
        a[x][y]=z; 
    }
    if(n*m<=10000){
        dfs(1,1);
        cout<<s;
    }else{
        cout<<0;
    }
	return 0;
}