首页 > 代码库 > NYOJ---蛇形填数(方块填数+三角填数)
NYOJ---蛇形填数(方块填数+三角填数)
蛇形填数
时间限制: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 1 6 9 2 5 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 LOCAL freopen("input.txt" , "r" , stdin); freopen("output.txt" , "w" , stdout); #endif int 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 5 12 13 14 6 11 15 7 10 8 9
跟蛇形填数一样,只是填数要求按照三角形填。注意每组数据之间用空行隔开- 输入
- 第一行有一个N,表示N组测试数据
接下来每组数据包括一个数字X,表示三角形的边长,0< X <1000 - 输出
- 输出之后填好之后的图
- 样例输入
2 5 4
- 样例输出
1 2 3 4 5 12 13 14 6 11 15 7 10 8 9 1 2 3 4 9 10 5 8 6 7
- 来源
- 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 LOCAL freopen("input.txt" , "r" , stdin); freopen("output.txt" , "w" , stdout); #endif cin >> 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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。