我在P1405中超时,求指导一下判断x>n后快速如何判断行列相等
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[20],stdd;
bool vis[20],flag ;
int ans[10][10];
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
void dfs(int x,int y){
if(flag) return ;
if(y>n){
x++;
y=1;
}
if(x>n){
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cnt+=ans[i][j];
}
if(cnt!=stdd) return ;
cnt=0;
}
cnt=0;
for(int j=1;j<=n;j++){
for(int i=1;i<=n;i++){
cnt+=ans[i][j];
}
if(cnt!=stdd) return ;
cnt=0;
}
cnt=0;
for(int i=1;i<=n;i++) cnt+=ans[i][i];
if(cnt!=stdd) return ;
cnt=0;
for(int i=1;i<=n;i++) cnt+=ans[i][n-i+1];
if(cnt!=stdd) return ;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) cout<<ans[i][j]<<' ';
cout<<'\n';
}
flag=1;
return ;
}
for(int i=1;i<=n*n;i++){
if(!vis[i]){
vis[i]=1;
ans[x][y]=a[i];
dfs(x,y+1);
vis[i]=0;
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
n=read();
for(int i=1;i<=n*n;i++){
a[i]=read();
stdd+=a[i];
}
stdd/=n;
cout<<stdd<<'\n';
sort(a+1,a+(n*n)+1);
dfs(1,1);
}