题目详情 peter喜欢玩数字游戏,但数独这样的游戏对他来说太简单了,于是他准备玩一个难的游戏。游戏规则是在一个N*N 的表格里填数,规则:对于每个输入的N,从左上角开始,总是以对角线为起点,先横着填,再竖着填。这里给了一 些样例,请在样例中找到规律并把这个N*N的表格打印出来吧。 输入描述: 多组测试数据(数据量在100组以内)。每组测试数据只有一行为一个整数N(1<=N<=30),表示表格的大小。 输出描述: 对于每组输入数据,输出N行,为填完的表格(N行,每行N个整数,每个数字之间用空格隔开。 答题说明 输入样例: 3 5 输出样例: 1 2 3 4 6 7 5 8 9 1 2 3 4 5 6 10 11 12 13 7 14 17 18 19 8 15 20 22 23 9 16 21 24 25 参考思路: 如果我们知道了n对应的表格,那么比较容易得到n+1对应的表格,只需将n对应的表格的每个数加上 2*n + 1, 然后在上面加一行(从1到n+1),左边加一列(1, n+2到2×n + 1),所以可以用record[30][30][30] 做记录,record[i]表示i对应的表格。 代码: #include <iostream> using namespace std; int array[31][31][31]; int n; void init() { array[1][1][1] = 1; for(int i=2; i<=30; i++) { int j, k; for(j=1; j<=i; j++) { array[i][1][j] = j; } for(j=2; j<=i; j++) { array[i][j][1] = i + j - 1; } for(j=2; j<=i; j++) { for(k=2; k<=i; k++) { array[i][j][k] = array[i-1][j-1][k-1] + 2 * i - 1; } } } } int main() { init(); while(cin>>n) { for(int i=1; i<=n; i++) { for(int j=1; j<n; j++) { cout<<array[n][i][j]<<' '; } cout<<array[n][i][n]<<endl; } } return 0; }