B - Matrix of Differences
题目
题目要求是让我们构造一个差值种类最多的矩阵
- 比赛时的思路就是,找了一会规律,也想到了最多n*n-1个不同的差值,但没找到有效的规律,索性就直接dfs,奈何剪枝太差劲,4就跑不出来了
dfs超时代码
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int cnt[N*N], sub[N*N];
int cur[N*N], res[N*N];
int t, n;
int ans;
int op;
void dfs(int idx, int sum)
{
if(op) return ;
if(idx == n*n)
{
if(sum > ans)
{
if(sum == n*n - 1)
{
op == 1;
}
ans = sum;
for(int i = 0; i < n*n; i ++) res[i] = cur[i];
}
return;
}
int x = idx/n;
int y = idx%n;
for(int i = 1; i <= n*n; i ++)
{
if(!cnt[i])
{
int a = 0, b = 0;
cur[idx] = i;
cnt[i] ++;
if(x-1 >=0 && x-1 <n)
{
if(!sub[abs(cur[idx]-cur[(x-1)*n+y])])
{
sum ++;
sub[abs(cur[idx]-cur[(x-1)*n+y])] ++;
a = abs(cur[idx]-cur[(x-1)*n+y]);
}
}
if(y-1 >= 0 && y-1 < n)
{
if(!sub[abs(cur[idx]-cur[x*n+(y-1)])])
{
sum ++;
sub[abs(cur[idx]-cur[x*n+(y-1)])] ++;
b = abs(cur[idx]-cur[x*n+(y-1)]);
}
}
dfs(idx + 1, sum);
cnt[i] --;
if(a)
sub[a] --, sum --;
if(b)
sub[b] --, sum --;
}
}
}
int main()
{
cin >> t;
while(t --)
{
ans = 0;
op = 0;
cin >> n;
dfs(0, 0);
for(int i= 0; i < n; i ++)
{
for(int j = 0; j < n; j ++)
{
printf("%d ",res[i*n+j]);
}
printf("\n");
}
}
return 0;
}
- 正解是构造一个蛇形矩阵,我们发现一个n阶的矩阵最多有n*(2n-2)个差值,我们只需要在里面选n-1个当作答案就好,然后按照从上到下,先从左到右,再由右到左这样蛇形下来就一共有n-1个相邻的差值,我们就可以按照这个顺序来构造差值以此为(n-1),(n-2),…,1的矩阵
AC代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 55;
int t, n;
int res[N*N];
int main()
{
cin >> t;
while(t --)
{
cin >> n;
int tem = -(n*n - 1);
res[0] = n*n;
for(int i = 1; i < n*n; i ++)
{
res[i] = res[i-1] + tem;
if(tem > 0) tem --;
else tem ++;
tem = -(tem);
}
for(int i = 0; i < n; i ++)
{
for(int j = 0; j < n; j ++)
{
if(i & 1)
{
printf("%d ", res[i*n + n - 1 - j]);
}
else
{
printf("%d ", res[i*n + j]);
}
}
puts("");
}
}
return 0;
}