1 条题解
-
0
题目:ys的snake
题目分析:
此题与oj训练幸运99内的snake极其相似,甚至就是oj99的改编,与oj的snake不同的是,本题所输出的snake图形是矩形,而不是严格的正方形。但其做法与snake是一样的。
在snake进行递推的时候,我们要考虑的是snake的边界问题,既控制本次循环你的起点在哪里,终点在哪里,依次递推直到所有的snake都填充完毕,也就是snake最后一位就是 。
代码层面上,我们可以定义一个表示当前snake值的数times,times等于多少就代表当前snake。之后定义四个控制边界的变量,设为x1,x2,y1,y2。在每次循环的时候,我们经过一次行和列需要对相应的值进行处理,比如经过最上面的边,其上边界就要+1,经过最右边的边,其右边界就要-1,依次递推得到左边界和下边界的关系。就这样一直循环,直到times的值大于 了,就代表times已经把 的值都赋值了,也就是snake结束了。
像做这种模拟题的时候耐下心分析模拟题的本质是最重要的,不管是正着推还是反着推,都要找到模拟的步骤,看看能否通过简单的模拟方法去实现这个问题。如同模拟一样,打A也是一个漫长的过程,但打A所带来的收获也是巨大的。小了说可以给你带来综测的加分、单项奖学金的评比,大了说就是解决问题的思维与方法。
#include<stdio.h> int num[1005][1005]; int main() { int n,m; scanf("%d %d",&n,&m); int times = 1; int n1 = 1; int n2 = m; int y1 = 1; int y2 = n; if(n == 1 && m == 1) { printf("1\n"); return 0; } while(times < n*m) { for(int i = n1; i <= n2; i++) { num[y1][i] = times++; } y1++; if(times > n*m) break; for(int i = y1; i <= y2; i++) { num[i][n2] = times++; } n2--; if(times > n*m) break; for(int i = n2; i >= n1; i--) { num[y2][i] = times++; } y2--; if(times > n*m) break; for(int i = y2; i >= y1; i--) { num[i][n1] = times++; } n1++; if(times > n*m) break; } for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { printf("%d ",num[i][j]); } printf("\n"); } }
- 1
信息
- ID
- 1007
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 106
- 已通过
- 23
- 上传者