求助(玄关)
  • 板块题目总版
  • 楼主Danny_chan
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/28 11:16
  • 上次更新2024/9/28 13:44:31
查看原帖
求助(玄关)
1032960
Danny_chan楼主2024/9/28 11:16

P9752 [CSP-S 2023] 密码锁 为啥这个满分

#include<bits/stdc++.h>
using namespace std;
int n;
int a[10][10],summ;
int b[10];
int c(int x,int y){
	if(x<=y){
		return y-x;
	}
	else return 10-x+y;
}
bool is(int x){
	int s[10],cnt=0;
	for(int i=1;i<=5;i++){
		if(b[i]!=a[x][i]){
			s[++cnt]=i;
		}
	}
	if(cnt==0) return false;
	if(cnt==1) return true;
	if(cnt>2) return false;
	if(abs(s[1]-s[2])!=1) return false;
	if(c(b[s[1]],a[x][s[1]])==c(b[s[2]],a[x][s[2]])) return true;
	else return false;
}
bool check(){
	for(int i=1;i<=n;i++){
		if(is(i)==false){
			return false;
		}
	}
	return true;
}
void dfs(int x){
	if(x>5){
		if(check()){
			summ++;
		}
		return ;
	}
	for(int i=0;i<10;i++){
		b[x]=i;
		dfs(x+1);
		b[x]=0;
	}

}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=5;j++){
			cin>>a[i][j];
		}
	}
	dfs(1);
	cout<<summ<<endl;
	return 0;
}

这个是30分

#include<bits/stdc++.h>
using namespace std;
int n;
int a[10][10],summ;
int b[10];
int c(int x,int y){
	if(x<=y){
		return y-x;
	}
	else return 10-x+y;
}
bool is(int x){
	int s[10],cnt=0;
	for(int i=1;i<=5;i++){
		if(b[i]!=a[x][i]){
			s[++cnt]=i;
		}
	}
	if(cnt==0) return false;
	if(cnt==1) return true;
	if(cnt>2) return false;
	if(abs(s[1]-s[2])!=1) return false;
	if(c(b[s[1]],a[x][s[1]])==c(b[s[2]],a[x][s[2]])) return true;
	else return false;
}
bool check(){
	for(int i=1;i<=n;i++){
		if(is(i)){
			return true;
		}
	}
	return false;
}
void dfs(int x){
	if(x>5){
		if(check()){
			summ++;
		}
		return ;
	}
	for(int i=0;i<10;i++){
		b[x]=i;
		dfs(x+1);
		b[x]=0;
	}

}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=5;j++){
			cin>>a[i][j];
		}
	}
	dfs(1);
	cout<<summ<<endl;
	return 0;
}
2024/9/28 11:16
加载中...