L2-4 吉利矩阵

L2-4 吉利矩阵

分数 25

全屏浏览

切换布局

作者 陈越

单位 浙江大学

所有元素为非负整数,且各行各列的元素和都等于 7 的 3×3 方阵称为"吉利矩阵",因为这样的矩阵一共有 666 种。

本题就请你统计一下,把 7 换成任何一个 [2,9] 区间内的正整数 L,把矩阵阶数换成任何一个 [2,4] 区间内的正整数 N,满足条件"所有元素为非负整数,且各行各列的元素和都等于 L"的 N×N 方阵一共有多少种?

输入格式:

输入在一行中给出 2 个正整数 L 和 N,意义如题面所述。数字间以空格分隔。

输出格式:

在一行中输出满足题目要求条件的方阵的个数。

输入样例:

7 3

输出样例:

666

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

栈限制

8192 KB

超时。。然后打表。。

#include<iostream> 

using namespace std;
const int N=10;
int l,n;
int res;
int g[N][N];

void dfs(int x,int y){

	if(x==n){
		bool hefa=true;
		for(int i=0;i<n&&hefa;i++){
			int sum=0;
			for(int j=0;j<n&&hefa;j++){
				sum+=g[i][j];
			}
			if(sum!=l)return;
		} 
		for(int i=0;i<n&&hefa;i++){
			int sum=0;
			for(int j=0;j<n&&hefa;j++){
				sum+=g[j][i];
			}
			if(sum!=l)return;
		} 
	//		printf("x=%d y=%d res=%d\n",x,y,res);
		res++;
//		for(int i=0;i<n&&hefa;i++){
//		
//			for(int j=0;j<n&&hefa;j++){
//				cout<<g[i][j]<<" ";
//			}
//			cout<<"\n";
//		} 
		
		return;
	}
	if(x==n&&y==0)return;

	int y1=y+1;
	int x1=x;
	if(y1==n)y1=0,x1=x1+1;
	for(int i=0;i<=l;i++){
		g[x][y]=i;
	//	printf("x1=%d y1=%d\n",x1,y1);
		dfs(x1,y1);
	}
}

int main(){
	cin>>l>>n;
	
	dfs(0,0);
	cout<<res; 
}

打表代码(需剪枝不然4阶矩阵直接搜麻)(上面代码还需优化)

#include<iostream> 

using namespace std;
const int N=10;
int l,n;
ll res;
int g[N][N];

void dfs(int x,int y){

	if(x==n){
		bool hefa=true;
		for(int i=0;i<n&&hefa;i++){
			int sum=0;
			for(int j=0;j<n&&hefa;j++){
				sum+=g[i][j];
			}
			if(sum!=l)return;
		} 
		for(int i=0;i<n&&hefa;i++){
			int sum=0;
			for(int j=0;j<n&&hefa;j++){
				sum+=g[j][i];
			}
			if(sum!=l)return;
	} 
	
	
	
		//	printf("x=%d y=%d res=%d\n",x,y,res);
		res++;
//		for(int i=0;i<n&&hefa;i++){
//		
//			for(int j=0;j<n&&hefa;j++){
//				cout<<g[i][j]<<" ";
//			}
//			cout<<"\n";
//		} 
		
		return;
	}
	
	if(x>=n)return; 
	if(x>0&&x<n){//剪1 
	
		int sum=0;
		for(int j=0;j<n;j++){
			sum+=g[x-1][j];
		}
		if(sum!=l)return;
	} 
	
	if(x<n){//剪2
	
		int sum=0;
		for(int j=0;j<y;j++){
			sum+=g[x][j];
		}
		if(sum>l)return;
	} 
		if(x>0&&x<n){//剪3
	
		int sum=0;
		for(int i=0;i<y;i++){
		int sum=0;
		for(int j=0;j<x;j++){
			sum+=g[j][y];
		}
		if(sum>l)return;
		}
		
	} 
	

	int y1=y+1;
	int x1=x;
	if(y1==n)y1=0,x1=x1+1;
	for(int i=0;i<=l;i++){
		g[x][y]=i;
	//	printf("x1=%d y1=%d\n",x1,y1);
		dfs(x1,y1);
	}
}


int main(){
	
	for(l=2;l<10;l++){
		for(n=2;n<5;n++){
				res=0;
				dfs(0,0);
				printf("a[%d][%d]=%d;\n",l,n,res);
		}
	}

}

最终代码

#include<iostream>

using namespace std;

const int N=20;
int a[N][N];

int main(){
	int l,n;cin>>l>>n;
	a[2][2]=3;
a[2][3]=21;
a[2][4]=282;
a[3][2]=4;
a[3][3]=55;
a[3][4]=2008;
a[4][2]=5;
a[4][3]=120;
a[4][4]=10147;
a[5][2]=6;
a[5][3]=231;
a[5][4]=40176;
a[6][2]=7;
a[6][3]=406;
a[6][4]=132724;
a[7][2]=8;
a[7][3]=666;
a[7][4]=381424;
a[8][2]=9;
a[8][3]=1035;
a[8][4]=981541;
a[9][2]=10;
a[9][3]=1540;
a[9][4]=2309384;
cout<<a[l][n];
}
相关推荐
eguid_112 分钟前
JavaScript图像处理,常用图像边缘检测算法简单介绍说明
javascript·图像处理·算法·计算机视觉
带多刺的玫瑰26 分钟前
Leecode刷题C语言之收集所有金币可获得的最大积分
算法·深度优先
LabVIEW开发32 分钟前
PID控制的优势与LabVIEW应用
算法·labview
涅槃寂雨1 小时前
C语言小任务——寻找水仙花数
c语言·数据结构·算法
『往事』&白驹过隙;1 小时前
操作系统(Linux Kernel 0.11&Linux Kernel 0.12)解读整理——内核初始化(main & init)之缓冲区的管理
linux·c语言·数据结构·物联网·操作系统
就爱学编程1 小时前
从C语言看数据结构和算法:复杂度决定性能
c语言·数据结构·算法
半桔1 小时前
栈和队列(C语言)
c语言·开发语言·数据结构·c++·git
刀客1231 小时前
数据结构与算法再探(六)动态规划
算法·动态规划
金融OG2 小时前
99.11 金融难点通俗解释:净资产收益率(ROE)VS投资资本回报率(ROIC)VS总资产收益率(ROA)
大数据·python·算法·机器学习·金融
king-xxz2 小时前
动态规划:斐波那契形(初阶)
算法·动态规划