https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5281
构造
奇数部分的构造方法:
9 7 5 3 1
9 7 5 3 3
9 7 5 5 5
9 7 7 7 7
9 9 9 9 9
偶数部分的构造方法
8 8 8 8
8 8 8 8
6 6 4 4
6 6 4 4
6 6 2 2
然后把两部分拼起来即可
如果多一个偶数,就在最右面在加两排,例如
10 10
10 10
10 10
10 10
10 10
应该是可以找到规律直接输出的,,,,当时忘记了输出要求,结果把这个图案打印到数组里,没想找规律了。。就直接加了个dfs。。。。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
using namespace std;
int ans[505][505],n,y;
vector<pair<int,int> >w[505];
int solve(int l,int r,int flog,int x)
{
int i,j;
if(x==2)
{
if(y/2==l)
{
ans[l][r]=ans[l+1][r]=2;
}
else
{
ans[l][r+1]=ans[l][r]=2;
}
return 0;
}
if(flog==0)
{
for(i=0;i<2;i++)
{
for(j=r;j<=y;j++)
ans[l+i][j]=x;
}
solve(l+2,r,1,x-2);
}
else
{
for(i=0;i<2;i++)
{
for(j=l;j<=y/2+1;j++)
{
ans[j][r+i]=x;
}
}
solve(l,r+2,0,x-2);
}
}
int book[505][505];
int ne[4][2]={1,0,-1,0,0,1,0,-1};
int dfs(int x,int l,int r)
{
if(book[l][r]||ans[l][r]==0)
return 0;
if(ans[l][r]==x)
{
book[l][r]=1;
w[x].push_back(make_pair(l,r));
for(int i=0;i<4;i++)
{
dfs(x,l+ne[i][0],r+ne[i][1]);
}
}
return 0;
}
int main()
{
int i,j,x,t;
while(~scanf("%d",&n))
{
memset(book,0,sizeof(book));
memset(ans,0,sizeof(ans));
for(i=0;i<=n;i++)
w[i].clear();
if(n==1)
{
printf("1 1\n");
printf("1 1\n");
continue;
}
else if(n==2)
{
printf("1 3\n");
printf("1 1\n");
printf("1 2 1 3\n");
continue;
}
x=(n+1)/2;
int xx,yy;
if(n%2==0)
{
y=n-1;
xx=x,yy=n+1;
printf("%d %d\n",x,n+1);
}
else
{
y=n;
xx=x,yy=n;
printf("%d %d\n",x,n);
}
t=y;
for(i=1;t>0;i++,t-=2)
{
for(j=1;j<=t/2+1;j++)
{
ans[j][i]=t;
}
for(j=y/2+1;j>=i;j--)
{
ans[t/2+1][j]=t;
}
}
solve(1,y/2+2,0,y-1);
if(n%2==0)
{
for(i=n;i<=n+1;i++)
{
for(j=1;j<=n/2;j++)
ans[j][i]=n;
}
}
/* for(i=1;i<=xx;i++)
{
for(j=1;j<=yy;j++)
printf("%d ",ans[i][j]);
printf("\n");
}*/
for(i=1;i<=y/2+1;i++)
{
dfs(ans[1][i],1,i);
}
for(i=1;i<=xx;i++)
{
for(j=y/2+2;j<=yy;j++)
{
dfs(ans[i][j],i,j);
}
}
for(i=1;i<=n;i++)
{
for(j=0;j<w[i].size();j++)
{
if(j!=0)
printf(" ");
printf("%d %d",w[i][j].first,w[i][j].second);
}
printf("\n");
}
}
}
看了题解有一种写法更简单的方法
除了1~5,特判输出一下
其余往上填都能一对数一对数的填
7:
x x x x x 6 6
x x x x x 6 6
x x x x x 7 6
7 7 7 7 7 7 6
9的情况
x x x x x 6 6 8 8
x x x x x 6 6 8 8
x x x x x 7 6 8 8
7 7 7 7 7 7 6 9 8
9 9 9 9 9 9 9 9 8
奇数填最下面一行,偶数填右边两行,然后奇数和比他小一的偶数互换一个(红色标注)
这样会好写很多