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