社区讨论
我怀疑这道题测试点有问题
P1406方格填数参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo1hzazw
- 此快照首次捕获于
- 2023/10/22 21:21 2 年前
- 此快照最后确认于
- 2023/11/02 22:15 2 年前
@kkksc03 @yeszy
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
int num[25],n,a[5][5],c;
bool vis[25];
void print(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout << a[i][j] << " ";
}
cout << endl;
}
exit(0);
}
void dfs(int i,int j){
if(i==n+1){
print();
}
int sum=0,sum2=0,sum3=0;
if(i==n && j==1){
for(int k=n;k>1;k--){
sum+=a[n-k+1][k];
}
for(int k=1;k<n;k++){
sum2+=a[k][j];
}
}else if(i==n && j==n){
for(int k=1;k<n;k++){
sum+=a[k][j];
}
for(int k=1;k<n;k++){
sum2+=a[i][k];
}
for(int k=1;k<n;k++){
sum3+=a[k][k];
}
}else if(i==n){
for(int k=1;k<n;k++){
sum+=a[k][j];
}
}else if(j==n){
for(int k=1;k<n;k++){
sum+=a[i][k];
}
}
for(int k=1;k<=n*n;k++){
if(vis[k]==0){
if(i==n && j==n){
if(num[k]==c-sum && num[k]==c-sum2 && num[k]==c-sum3){
a[i][j]=num[k];
print();
}
}else if(i==n || j==n){
if(num[k]==c-sum){
vis[k]=1;
a[i][j]=num[k];
dfs(i+j/n,j%n+1);
vis[k]=0;
a[i][j]=0;
}
}else{
vis[k]=1;
a[i][j]=num[k];
dfs(i+j/n,j%n+1);
vis[k]=0;
a[i][j]=0;
}
}
}
}
signed main(){
cin >> n;
for(int i=1;i<=n*n;i++){
cin >> num[i];
c+=num[i];
}
c/=n;
cout << c << endl;
dfs(1,1);
return 0;
}
对于1~16的幻方,洛谷给出的字典序最小的方案是7 12 1 14 2 3 8 11 16 3 10 59 6 15 4,但是难道1 2 15 16 12 14 3 5 13 7 10 4 8 11 6 9不是更小吗
如果是代码或理解问题,欢迎留言
回复
共 4 条回复,欢迎继续交流。
正在加载回复...