题意:给你一个数N,让你输出一个对角线都为0,每行填入1~n-1的数字,每行没有重复的数字,并且矩阵对于对角线对称。
思路:对第一行进行从1~n-1初始化,然后对于左上角矩阵初始化,用f[i][j][2]标记第i行或第i列中是否已使用数字j,然后遍历除对角线外没有填字的格子
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
short map[1001][1001];
bool flag[1001][1001][2];
int main()
{
int n;
while(cin>>n)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
{
map[i][j]=0;
flag[i][j][0]=flag[i][j][1]=false;
}
for(int j=1; j<n; j++)
{
map[0][j]=j;
flag[0][j][0]=true;
flag[j][j][1]=true;
}
for(int i=1; i<n; i++)
{
int j=1;
while(i-j>=0&&j<n)
{
if(i-j==j)
{
j++;
continue;
}
map[j][i-j]=map[0][i];
flag[j][map[0][i]][0]=true;
flag[i-j][map[0][i]][1]=true;
j++;
}
}
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(map[i][j]==0&&i!=j)
{
for(int k=1; k<=n-1; k++)
if(!flag[i][k][0]&&!flag[j][k][1])
{
map[i][j]=k;
flag[i][k][0]=true;
flag[j][k][1]=true;
break;
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cout<<map[i][j]<<" ";
cout<<endl;
}
}
return 0;
}