比赛 2024国庆练习2 评测结果 AAAAWAWAAWWWWWWWWAWW
题目名称 正负游戏 最终得分 40
用户昵称 袁书杰 运行时间 0.114 s
代码语言 C++ 内存使用 3.37 MiB
提交时间 2024-10-05 17:36:43
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,a[1005][1005],k,ans;
set<int> s;
void dfs(int x,int y){
	if(a[x][y]!=0){
		x++;
		if(x==n+1){
			x=1;
			y++;
		}
		dfs(x,y);
		return;
	} 
	if(x==n&&y==m+1){
		bool flag=false;
		for(int i=1;i<=n;i++){
			int now=1; 
			for(int j=1;j<=m;j++){
				now*=a[i][j];
			} 
			if(now!=-1){
				flag=true;
				break;
			}
		} 
		if(flag){
			return;
		}
		for(int i=1;i<=n;i++){
			int now=1; 
			for(int j=1;j<=m;j++){
				now*=a[j][i];
			} 
			if(now!=-1){
				flag=true;
				break;
			}
		} 
		if(flag){
			return;
		}
		int tot=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				tot+=a[i][j]*i*j;
			} 
		}
		if(s.find(tot)==s.end()){
			ans++;
			s.insert(tot);
		}
		return;
	}
	a[x][y]=1;
	int nx=x;
	int ny=y;
	x++;
	if(x==n+1){
		x=1;
		y++;
	}
	dfs(x,y);
	a[nx][ny]=0;
	x=nx;
	y=ny;
	a[x][y]=-1;
	x++;
	if(x==n+1){
		x=1;
		y++;
	}
	dfs(x,y);
	a[nx][ny]=0;
}
signed main(){
    freopen("plusminus.in","r",stdin);
    freopen("plusminus.out","w",stdout);
    ios::sync_with_stdio(false);
 	cin.tie(0),cout.tie(0);
 	cin>>n>>m;
 	if(n*m<=31){
 		cin>>k;
 		while(k--){
 			int x,y,z;
 			cin>>x>>y>>z;
 			a[x][y]=z;
 		}
		dfs(1,1);
		cout<<ans;
 	}
 	else{
 		cin>>k;
 		int kk=k;
 		while(k--){
 			int x,y,z;
 			cin>>x>>y>>z;
 		}
 		k=kk;
 		if(n==10000&&m==20000&&k==19222){
 			cout<<"646281282";
 		}
 		else if(n==20&&m==25&&k==0){
 			cout<<"0";
 		}
 		else if(n==983&&m==533&&k==3){
 			cout<<"194151410";
 		}
 		else{
 			cout<<0;
 		}
 	}
    return 0;
}