#include<bits/stdc++.h>
using namespace std;
int n, a[11][11], cnt=1;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
a[i][j]=cnt;
cnt++;
//场宽为3, 右对齐
printf("%3d", a[i][j]);
//如果为左对齐的话, 需要改为下面这一行
// printf("%-3d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n, a[11][11], cnt=1;
int main()
{
scanf("%d", &n);
for(int i=n; i>=1; --i){
for(int j=1; j<=n; ++j){
a[i][j]=cnt;
cnt++;
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
//场宽为3, 右对齐
printf("%3d", a[i][j]);
//如果为左对齐的话, 需要改为下面这一行
// printf("%-3d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n, a[11][11], cnt=1;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){ //列
for(int j=1; j<=n; ++j){ //行
a[j][i]=cnt;
cnt++;
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
//场宽为3, 右对齐
printf("%3d", a[i][j]);
//如果为左对齐的话, 需要改为下面这一行
// printf("%-3d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n, a[11][11], cnt=1;
int main()
{
scanf("%d", &n);
for(int i=n; i>=1; --i){ //列
for(int j=1; j<=n; ++j){ //行
a[j][i]=cnt;
cnt++;
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
//场宽为3, 右对齐
printf("%3d", a[i][j]);
//如果为左对齐的话, 需要改为下面这一行
// printf("%-3d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n, a[11][11], cnt=1;
int main()
{
scanf("%d", &n);
for(int i=n; i>=1; --i){ //行
for(int j=n; j>=1; --j){ //列
a[i][j]=cnt;
cnt++;
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
//场宽为3, 右对齐
printf("%3d", a[i][j]);
//如果为左对齐的话, 需要改为下面这一行
// printf("%-3d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n, a[11][11], cnt=1;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){ //行
for(int j=n; j>=1; --j){ //列
a[i][j]=cnt;
cnt++;
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
//场宽为3, 右对齐
printf("%3d", a[i][j]);
//如果为左对齐的话, 需要改为下面这一行
// printf("%-3d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
a[i][i]=1;
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
a[i][n-i+1]=1;
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//每行第一列单独处理
a[i][1]=a[i-1][1]+1;
//每行从第二列起, 等于左边的数+1
for(int j=2; j<=n; ++j){
a[i][j]=a[i][j-1]+1;
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
bool flag;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//每行第一列单独处理
a[i][1]=i;
flag=false;
//每行从第二列起
for(int j=2; j<=n; ++j){
//如果等于n, 则本行后面开始递减
if(a[i][j-1]==n){
flag=true;
}
if(flag==false){
a[i][j]=a[i][j-1]+1;
}
else{
a[i][j]=a[i][j-1]-1;
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
bool flag;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//每行第一列单独处理
a[i][1]=i;
flag=false;
//每行从第二列起
for(int j=2; j<=n; ++j){
//如果等于n, 则本行后面开始递减
if(a[i][j-1]==n){
flag=true;
}
if(flag==false){
a[i][j]=a[i][j-1]+1;
}
else{ //从1开始数
if(a[i][j-1]==n){
a[i][j]=1;
}
else{
a[i][j]=a[i][j-1]+1;
}
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3c",a[i][j]+'A'-1);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
bool flag;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//每行第一列单独处理
a[i][1]=n-i+1;
flag=false;
//每行从第二列起
for(int j=2; j<=n; ++j){
//如果等于n, 则本行后面开始递减
if(a[i][j-1]==n){
flag=true;
}
if(flag==false){
a[i][j]=a[i][j-1]+1;
}
else{
a[i][j]=a[i][j-1]-1;
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//对角线单独处理
a[i][i]=i;
//处理对角线延伸的行和列
for(int j=i+1; j<=n; ++j){
a[i][j]=a[j][i]=a[i][i];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//对角线单独处理
a[i][i]=n+1-i;
//处理对角线延伸的行和列
for(int j=1; j<i; ++j){
a[i][j]=a[j][i]=a[i][i];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//对角线单独处理
a[i][i]=n+1-i;
//处理对角线延伸的行和列
for(int j=i+1; j<=n; ++j){
a[i][j]=a[j][i]=a[i][i];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
if(j<=i){
a[i][j]=i;
}
else{
a[i][j]=a[i][j-1]+1;
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
a[i][n+1-i]=i;
for(int j=1; j<=n-i; ++j){
a[i][j]=a[i+j][n+1-i]=a[i][n+1-i];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
a[n+1-i][i]=i;
for(int j=i+1; j<=n; ++j){
a[n+1-i][j]=a[j-i][i]=i;
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//第一列单独处理
a[i][1]=n+1-i;
for(int j=2; j<=n; ++j){
if(j<=n+1-i){
a[i][j]=n+1-i;
}
else{
a[i][j]=a[i][j-1]+1;
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[10][10];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
//第n列单独处理
a[i][n]=i;
for(int j=n-1; j>=1; --j){
if(n+1-j<=i){
a[i][j]=i;
}
else{
a[i][j]=a[i][j+1]+1;
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, s, a[21][21];
int main()
{
scanf("%d %d", &n, &s);
for(int j=1; j<=n; ++j){ //列
for(int i=1; i<=j; ++i){ //行
a[i][j]=s;
s++;
if(s>9){
s=1;
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<i; ++j){
printf(" ");
}
for(int j=i; j<=n; ++j){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, curi, cnt=1, a[11][11];
int main()
{
scanf("%d", &n);
for(int i=n; i>=1; --i){ //行
curi=i;
for(int j=1; j<=n+1-i; ++j){ //列
a[curi][j]=cnt;
cnt++; //每个数累加
curi++; //每次行加一, 列加一
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=i; ++j){
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, curj, cnt=1, a[18][18];
int main()
{
scanf("%d", &n);
//从右上角1递增, 填补右上部分
for(int j=n; j>=1; --j){ //列
curj=j;
for(int i=1; i<=n+1-j; ++i){ //行
a[i][curj]=cnt;
cnt++; //每个数累加
curj++; //每次行加一, 列加一
}
}
//从左下角n*n递减回去, 填补左下部分
cnt=n*n;
for(int j=1; j<n; ++j){ //列
curj=j;
for(int i=n; i>=n+1-j; --i){ //行
a[i][curj]=cnt;
cnt--; //每个数递减
curj--; //每次行减一, 列减一
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, curi, curj, cnt=1, a[18][18];
int main()
{
scanf("%d", &n);
for(int i=n; i>=1; --i){ //行递减
for(int j=1; j<=n+1-i; ++j){ //向右走列递增
a[i][j]=cnt;
cnt++;
}
curj=n+1-i;
for(curi=i+1; curi<=n; ++curi){ //向下走行递增
a[curi][curj]=cnt;
cnt++;
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, curi, curj, cnt=1, a[19][19];
int main()
{
scanf("%d", &n);
//左上半部分
for(int i=1; i<=n; ++i){ //行
//从右上到左下
curi=1;
for(int j=i; j>=1; --j){ //列
a[curi][j]=cnt;
cnt++; //每个数累加
curi++; //每次行加一, 列减一
}
if(i==n){
break;
}
//从左下到右上
i++;
curi=i;
for(int j=1; j<=i; ++j){ //列
a[curi][j]=cnt;
cnt++; //每个数累加
curi--; //每次行减一, 列加一
}
}
cnt=n*n;
//右下半部分
for(int i=n; i>1; --i){ //行
//从左下到右上
curj=i;
for(curi=n; curi>=i; --curi){
a[curi][curj]=cnt;
cnt--; //每个数递减
curj++; //每次行减一, 列加一
}
if(i==2) break;
i--;
//从右上到左下
curi=i;
for(int j=n; j>=i; --j){ //列
a[curi][j]=cnt;
cnt--; //每个数递减
curi++; //每次行加一, 列减一
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
方法1
#include <bits/stdc++.h>
using namespace std;
int n, cnt=1, fenzi, fenmu;
//flag为false表示分母递增,分子递减
//flag为true表示分子递增,分母递减
bool flag;
int main()
{
scanf("%d", &n);
for(int i=1; ; ++i){
if(n>=cnt){
n-=cnt;
flag^=1;
cnt++;
}
else{
break;
}
}
if(n==0){ //如果第cnt趟没剩下数字,单独处理一下
cnt--;
n=1;
}
//flag为true表示分子递增,分母递减
if(flag){
fenzi=n;
fenmu=cnt-n+1;
}
else{ //flag为false表示分母递增,分子递减
fenzi=cnt-n+1;
fenmu=n;
}
printf("%d/%d\n", fenzi, fenmu);
return 0;
}
方法2(这道题空间限制比较严,会爆空间)
#include <iostream>
using namespace std;
int x[10000001], y[10000001];
int n;
int main()
{
cin >> n;
x[1]=y[1]=1;
for(int i=1; i<=n; ){
//向右挪一个
i++;
x[i]=x[i-1];
y[i]=y[i-1]+1;
i++;
//向左下方斜着挪
while(1){ //只要没有挪到第一列,就一直向左下方挪
x[i]=x[i-1]+1;
y[i]=y[i-1]-1;
if(y[i]==1){
break;
}
i++;
}
//向下挪一个
i++;
x[i]=x[i-1]+1;
y[i]=y[i-1];
i++;
//向右上方斜着挪
while(1){ //只要没有挪到第一行,就一直向右上方挪
x[i]=x[i-1]-1;
y[i]=y[i-1]+1;
if(x[i]==1){
break;
}
i++;
}
}
cout << x[n] << "/" << y[n];
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, cnt=1, row=1, column=1, a[10][10];
int flag=1; //1表示从左往右, 2表示从右往左, 3表示从上往下, 4表示从下往上
int main()
{
cin >>n;
while(1){
if(flag==1){ //从左往右
while(column<=n && a[row][column]==0){ //只要右边的没有填充,而且没有超出数组范围
a[row][column]=cnt; //就一直填充
cnt++;
column++; //列++
}
row++; //接下来要从上往下了,行要++
column--; //由于刚才的while循环使得列多加了一个,因此列要--
flag=3; //flag标记为3,接下来要从上往下了
if(cnt>n*n){ //如果此时已经填满n*n个数了,就跳出循环
break;
}
}
if(flag==3){ //从上往下
while(row<=n && a[row][column]==0){ //只要下边的没有填充,而且没有超出数组范围
a[row][column]=cnt; //就一直填充
cnt++;
row++; //行++
}
column--; //接下来要从右往左了,列要--
row--; //由于刚才的while循环使得行多加了一个,因此行要--
flag=2; //flag标记为2,接下来要从右往左了
if(cnt>n*n){ //如果此时已经填满n*n个数了,就跳出循环
break;
}
}
if(flag==2){ //从右往左
while(column>=1 && a[row][column]==0){ //只要左边的没有填充,而且没有超出数组范围
a[row][column]=cnt; //就一直填充
cnt++;
column--; //列--
}
row--; //接下来要从下往上了,行要--
column++; //由于刚才的while循环使得列多减了一个,因此列要++
flag=4; //flag标记为4,接下来要从下往上了
if(cnt>n*n){ //如果此时已经填满n*n个数了,就跳出循环
break;
}
}
if(flag==4){ //从下往上
while(row>=1 && a[row][column]==0){ //只要上边的没有填充,而且没有超出数组范围
a[row][column]=cnt; //就一直填充
cnt++;
row--; //行--
}
column++; //接下来要从左往右了,列要++
row++; //由于刚才的while循环使得行多减了一个,因此行要++
flag=1; //flag标记为1,接下来要从左往右了
if(cnt>n*n){ //如果此时已经填满n*n个数了,就跳出循环
break;
}
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%3d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, a[20][20];
/*
8 8 8 8 8 8 8 8
8 7 7 7 7 7 7 7
8 7 6 6 6 6 6 6
8 7 6 5 5 5 5 5
8 7 6 5 4 4 4 4
8 7 6 5 4 3 3 3
8 7 6 5 4 3 2 2
8 7 6 5 4 3 2 1
*/
int main()
{
scanf("%d", &n);
//填充左上角n*n矩阵
for(int i=1; i<=n; ++i){
for(int j=i; j<=n; ++j){
a[i][j]=a[j][i]=n+1-i;
}
}
//填充中心位置
a[n+1][n+1]=0;
//填充左上角n*n矩阵相邻的行和列
for(int i=1; i<=n; ++i){
a[i][n+1]=a[i][n]; //n*n矩阵右侧那一列
a[n+1][i]=a[n][i]; //n*n矩阵下方那一行
}
//填充右上角n*n矩阵
for(int i=1; i<=n; ++i){
for(int j=n+2; j<=2*n+1; ++j){
// n+2列对应n列 2*n+1列对应1列
a[i][j]=a[i][2*n+2-j];
}
}
//填充右上角n*n矩阵下面的那一行
for(int i=n+2; i<=2*n+1; ++i){
a[n+1][i]=a[n][i];
}
//填充左下角n*n矩阵
for(int i=n+2; i<=2*n+1; ++i){
for(int j=1; j<=n; ++j){
// n+2行对应n行 2*n+1行对应1行
a[i][j]=a[2*n+2-i][j];
}
}
//填充左下角n*n矩阵右侧那一列
for(int i=n+2; i<=2*n+1; ++i){
a[i][n+1]=a[i][n];
}
//填充右下角n*n矩阵
for(int i=n+2; i<=2*n+1; ++i){
for(int j=n+2; j<=2*n+1; ++j){
// n+2列对应n列 2*n+1列对应1列
a[i][j]=a[i][2*n+2-j];
}
}
for(int i=1; i<=2*n+1; ++i){
for(int j=1; j<=2*n+1; ++j){
printf("%2d", a[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, ans[101][101], a[101], cnt;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
scanf("%d", &a[i]);
ans[1][i]=a[i];
}
for(int i=1; i<=n; ++i){ //枚举a[]数组中的值
//a[i]在第i个位置, 需要找到那个位置上为i
for(int j=1; j<=n; ++j){
if(a[j]==i){
cnt=j; //a[i]在第i个位置上, 第cnt个位置放的是i
break;
}
}
for(int j=2; j<=n; ++j){ //填补ans[]数组的第2~n行
cnt++;
if(cnt>n){
cnt=1;
}
ans[j][a[cnt]]=a[i];
}
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=n; ++j){
printf("%d ", ans[i][j]);
}
printf("\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, x, y, startx, starty;
int main()
{
scanf("%d %d %d", &n, &x, &y);
//输出x行
for(int i=1; i<=n; ++i){
printf("(%d,%d)", x, i);
}
printf("\n");
//输出y列
for(int i=1; i<=n; ++i){
printf("(%d,%d)", i, y);
}
printf("\n");
if(x>y){
startx=x-(y-1);
starty=1;
}
else{
startx=1;
starty=y-(x-1);
}
//输出左上到右下对角线上的格子
for(int i=startx, j=starty; i<=n && j<=n; ++i, ++j){
printf("(%d,%d)", i, j);
}
printf("\n");
//在主对角线上
if(x+y==n+1){
startx=n;
starty=1;
}
else if(x+y<n+1){ //在主对角线左上方
startx=x+(y-1);
starty=1;
}
else{ //在主对角线右下方
startx=n;
starty=y-(n-x);
}
for(int i=startx, j=starty; i>=1 && j<=n; --i, ++j){
printf("(%d,%d)", i, j);
}
return 0;
}