c,c++,实现蛇形填数

题目信息
方形填数
描述

在一个NN的方阵中,填入1,2,……NN个数,并要求构成如下的格式:

例如:

N=5

13 14 15 16 1

12 23 24 17 2

11 22 25 18 3

10 21 20 19 4

9 8 7 6 5

N=6

16 17 18 19 20 1

15 30 31 32 21 2

14 29 36 33 22 3

13 28 35 34 23 4

12 27 26 25 24 5

11 10 9 8 7 6

输入
每个测试文件只包含一组测试数据,每组输入一个N。(1<=N<=20)

输出
输出构成的方阵,每个数字之间只有一个空格,行首,行末没有空格。

输入样例 1

5
输出样例 1

13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5

题目链接:http://39.105.150.169/contest/11/problem/A;
题目分析:数组用来解决与整数相关的问题时,通常是通过数组的下标来解决问题。通过观察题目样例不难发现。数字首先在首行的最后一列开始先向下移动,再向左移动,之后再向上移动,最后再往右移动。很显然这是一个循环,因此,我们可以通过数组的下标来控制数字的移动方向。

#include 
using namespace std;
int arr[25][25];
int j = 1;
int main()
{
     
	int n;
	cin>>n; 
	int x = 0;
	int y = n - 1;
	arr[x][y] = j;
	while(j < n * n)   											// 当j = n * n时,说明赋值完成 
	{
     
		while(x + 1 < n && !arr[x + 1][y]) arr[++x][y] = ++j;	//	向下移动,当到数组边缘,或者下一位已经赋值,结束循环 
		while(y - 1 >= 0 && !arr[x][y - 1]) arr[x][--y] = ++j;	//	向左移动,当到数组边缘,或者左一位已经赋值,结束循环
		while(x - 1 >= 0 && !arr[x - 1][y]) arr[--x][y] = ++j;	//	向上移动,当到数组边缘,或者上一位已经赋值,结束循环
		while(y + 1 < n && !arr[x][y + 1]) arr[x][++y] = ++j;	//	向右移动,当到数组边缘,或者右一位已经赋值,结束循环
	}
	for(int i = 0; i < n; i++) 
	{
     
		for(int k = 0; k < n; k++)
		{
     
			cout<<arr[i][k];
			if(k != n - 1)										//	最后一列之后,不在输出空格 
				cout<<" ";
		}
		if(i != n - 1)											// 最后一行之后 ,不在输出换行 
				cout<<"\n";
	}
} 

你可能感兴趣的:(oj习题)