NYOJ---蛇形填数(方块填数+三角填数)

来源:互联网 发布:看电影那个软件快 编辑:程序博客网 时间:2024/05/08 09:09

蛇形填数

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入
直接输入方陈的维数,即n的值。(n<=100)
输出
输出结果是蛇形方陈。
样例输入
3
样例输出
7 8 16 9 25 4 3
来源

算法经典

解析:个人认为是道比较经典的模拟题,很考察基本功,今天又拿来做了一下,方法就是模拟每个方向的坐标变化即可,顺便推荐本书,感觉刘汝佳的《算法竞赛入门经典》很适合入门的人来看哈!

贴一下自己的代码

#include <iostream>using std::endl;using std::cin;using std::cout;const int MAXN = 100 +10;int data[MAXN][MAXN];int main(){#ifdef LOCALfreopen("input.txt" , "r" , stdin);freopen("output.txt" , "w" , stdout);#endifint n;while(cin >> n){memset(data,0,sizeof(data));int x=0 , y = n-1 , cnt = 1;data[x][y] = cnt;while(cnt < n*n){//向下走while(x+1<n && !data[x+1][y]){data[++x][y] = ++cnt;}//向左走while(y-1>=0 && !data[x][y-1]){data[x][--y] = ++cnt;}//向上走while(x-1 >=0 && !data[x-1][y]){data[--x][y] = ++cnt;}//向右走while(y+1 <n && !data[x][y+1]){data[x][++y] = ++cnt;}}for(int i=0; i<n; ++i){for(int j=0; j<n; ++j){cout << data[i][j] << " ";}cout << endl;}}return 0;}

蛇形填数(二)

时间限制:2000 ms  |  内存限制:65535 KB
难度:3
描述
1  2  3  4  512 13 14 611 15 710 89
跟蛇形填数一样,只是填数要求按照三角形填。注意每组数据之间用空行隔开
输入
第一行有一个N,表示N组测试数据
接下来每组数据包括一个数字X,表示三角形的边长,0< X <1000
输出
输出之后填好之后的图
样例输入
254
样例输出
1  2  3  4  512 13 14 611 15 710 891  2  3  49  10 58  67
来源
NBOJ

解析:蛇形填数的变形,三角填数,本质还是模拟数字填充的方法即可哈!

贴一下自己的代码

#include <iostream>#include <string.h>using std::endl;using std::cin;using std::cout;const int MAXN = 1000 + 10;int data[MAXN][MAXN];int main(){int n;#ifdef LOCALfreopen("input.txt" , "r" , stdin);freopen("output.txt" , "w" , stdout);#endifcin >> n;while(n--){memset(data , 0 , sizeof(data));int length;cin >> length;int x=0 , y=0 , cnt = 1;data[x][y] = cnt;while(cnt < ((length+1)*length)/2){//向右走while(y+1 < length-x && !data[x][y+1]){data[x][++y] = ++cnt;}//向对角线走while(x+1 < length && y-1>=0 && !data[x+1][y-1]){data[++x][--y] = ++cnt;}//向上走while(x-1>=0 && !data[x-1][y]){data[--x][y] = ++cnt;}}//输出for(int i=0; i<length; ++i){for(int j=0; j<length - i; ++j){cout << data[i][j] << " ";}cout << endl;}cout << endl;}return 0;}


0 0