社区讨论

我怀疑这道题测试点有问题

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 条回复,欢迎继续交流。

正在加载回复...