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;
}