avatar
求顺时针打印矩阵code# JobHunting - 待字闺中
f*s
1
我是男的,但如果因为老婆生孩子申请降低teaching load,系主任说这个没问题,他
会在T&P的时候讲明我已经达到了teaching要求(生孩子而降低的teaching load要求)
,不会讲具体原因。我问系主任,faculty投票时候会不会发现我少教了一些课进而刁
难我,系主任说“你都达到teaching要求了”,但他也表示他不能保证其他faculty内
心会如何考量。
请问,各位faculty会如何看待达到teaching“要求”但却是比正常课程load要少一些
的情况呢?投票时候会以此作为一个攻击点吗?虽然明面上不会(规定也不能),但内
心会不会抬高其他方面的bar呢?多谢!
avatar
w*t
2
一个吃饭的团购,看着性价比还不错,但fine print中的有句话不明白是什么意思:
Must use promotional value in one visit,麻烦有人能给解释一下吗?多谢了!
avatar
k*p
3
就是打印如下矩阵,自己写得太乱了,求code,见笑了
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
avatar
d*a
4
我肯定不会。带小孩很花时间,如果小孩有过敏或特殊体质,或者LP工作忙,男发考题
就相对要花更多时间了。关键是教学质量,数量少一点可以接受。

【在 f********s 的大作中提到】
: 我是男的,但如果因为老婆生孩子申请降低teaching load,系主任说这个没问题,他
: 会在T&P的时候讲明我已经达到了teaching要求(生孩子而降低的teaching load要求)
: ,不会讲具体原因。我问系主任,faculty投票时候会不会发现我少教了一些课进而刁
: 难我,系主任说“你都达到teaching要求了”,但他也表示他不能保证其他faculty内
: 心会如何考量。
: 请问,各位faculty会如何看待达到teaching“要求”但却是比正常课程load要少一些
: 的情况呢?投票时候会以此作为一个攻击点吗?虽然明面上不会(规定也不能),但内
: 心会不会抬高其他方面的bar呢?多谢!

avatar
x*g
5
一次用完

【在 w**t 的大作中提到】
: 一个吃饭的团购,看着性价比还不错,但fine print中的有句话不明白是什么意思:
: Must use promotional value in one visit,麻烦有人能给解释一下吗?多谢了!

avatar
f*y
6
作业?
avatar
H*y
7
你有关键的地方没说明白,你是什么专业,对teaching和research要求比重多少?
你要是专业对funding要求高的而你又拿到了足够的,很多人都是buy out课程,当然不
会有多大问题了。
你要是纯教书专业或纯teaching school,无论现在对男老师家里生孩子多体谅,美国
公众的观点还是传统的。这么说吧,我们女老师当年生小孩的时候,除了六个星期假,
之外该干啥干啥。我们最多因此申请延期一年评tenure,但评审要求不会比正常的低。
(也就是说,其实代价还是自己背了。)
我当然体谅你,但没有用。因为大部分男AP这六年期间都有小孩出生,很少见人提的。
avatar
w*t
8
3x

【在 x*******g 的大作中提到】
: 一次用完
avatar
g*e
9
俺以前写的,看起来也比较乱
static void printMatrixClockWise(Cordinate tl, Cordinate tr, Cordinate bl,
Cordinate br ) {
if (tl.y > tr.y || bl.y > br.y || tl.x > bl.x || tr.x > br.x
)
return;

for (int i=tl.y; i<=tr.y; i++)
System.out.print(a[tl.x][i]+", ");

for (int i=tr.x+1; i<=br.x; i++)
System.out.print(a[i][br.y]+", ");

for (int i=br.y-1; i>=bl.y; i--)
System.out.print(a[bl.x][i]+", ");

for (int i=bl.x-1; i>tl.x; i--)
System.out.print(a[i][bl.y]+", ");

printMatrixClockWise(new Cordinate(tl.x+1, tl.y+1), new
Cordinate(tr.x+1, tr.y-1), new Cordinate(bl.x-1, bl.y+1), new Cordinate(br.x
-1, br.y-1));

}
class Cordinate {
int x;
int y;

Cordinate(int m, int n) {
x = m;
y = n;
}
}

【在 k*p 的大作中提到】
: 就是打印如下矩阵,自己写得太乱了,求code,见笑了
: 1 2 3 4
: 12 13 14 5
: 11 16 15 6
: 10 9 8 7

avatar
a*e
10
没错。发考题已经比别的行业时间自由多了,男人在家本来时间就很多。如果还没谈牛
,就这那借口,肯定不会给同行有啥好印象。
很多中国女人太娇气了,其他族裔女人比较能干耐劳。这边生完孩子出院就都能自理了
,中国女人得要别人照顾100天甚至一年。

【在 H****y 的大作中提到】
: 你有关键的地方没说明白,你是什么专业,对teaching和research要求比重多少?
: 你要是专业对funding要求高的而你又拿到了足够的,很多人都是buy out课程,当然不
: 会有多大问题了。
: 你要是纯教书专业或纯teaching school,无论现在对男老师家里生孩子多体谅,美国
: 公众的观点还是传统的。这么说吧,我们女老师当年生小孩的时候,除了六个星期假,
: 之外该干啥干啥。我们最多因此申请延期一年评tenure,但评审要求不会比正常的低。
: (也就是说,其实代价还是自己背了。)
: 我当然体谅你,但没有用。因为大部分男AP这六年期间都有小孩出生,很少见人提的。

avatar
k*p
11
版上出现过的面试题

【在 f*****y 的大作中提到】
: 作业?
avatar
r*e
12
说你行 你就行 不行也行
说你不行 你就不行 行也不行

【在 f********s 的大作中提到】
: 我是男的,但如果因为老婆生孩子申请降低teaching load,系主任说这个没问题,他
: 会在T&P的时候讲明我已经达到了teaching要求(生孩子而降低的teaching load要求)
: ,不会讲具体原因。我问系主任,faculty投票时候会不会发现我少教了一些课进而刁
: 难我,系主任说“你都达到teaching要求了”,但他也表示他不能保证其他faculty内
: 心会如何考量。
: 请问,各位faculty会如何看待达到teaching“要求”但却是比正常课程load要少一些
: 的情况呢?投票时候会以此作为一个攻击点吗?虽然明面上不会(规定也不能),但内
: 心会不会抬高其他方面的bar呢?多谢!

avatar
i*e
13
没搞懂你的问题,
到底是顺时钟打印矩阵?或者是打印以下的矩阵?
当 n=4,打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
两个是完全不同的问题。
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
avatar
c*x
14

看来每个系的情况还是很不一样的。想了一圈我们系的男同事们,太太生产的那个学期
,有一个或者半个学期的teaching reduction是很普遍的,同事们完全理解,从来没有
见谁拿这个说事儿的。
看看你们系里的common practice吧。其实每个人都没有teaching reduction是一种均
衡,每个人都有teaching reduction也是一个均衡。
哪个均衡对faculty个人的福利水平更高,对系里的长期研究教学更有效率,似乎也挺
显而易见的。

【在 f********s 的大作中提到】
: 我是男的,但如果因为老婆生孩子申请降低teaching load,系主任说这个没问题,他
: 会在T&P的时候讲明我已经达到了teaching要求(生孩子而降低的teaching load要求)
: ,不会讲具体原因。我问系主任,faculty投票时候会不会发现我少教了一些课进而刁
: 难我,系主任说“你都达到teaching要求了”,但他也表示他不能保证其他faculty内
: 心会如何考量。
: 请问,各位faculty会如何看待达到teaching“要求”但却是比正常课程load要少一些
: 的情况呢?投票时候会以此作为一个攻击点吗?虽然明面上不会(规定也不能),但内
: 心会不会抬高其他方面的bar呢?多谢!

avatar
k*p
15
就是打印出来,按行的那种,不需要真的按顺时针挨个打

【在 i**********e 的大作中提到】
: 没搞懂你的问题,
: 到底是顺时钟打印矩阵?或者是打印以下的矩阵?
: 当 n=4,打印:
: 1 2 3 4
: 12 13 14 5
: 11 16 15 6
: 10 9 8 7
: 两个是完全不同的问题。
: 一些常见面试题的答案与总结 -
: http://www.ihas1337code.com

avatar
c*x
16

这个情况比较复杂。
生产的妈妈,见过生产完就养尊处优,一年十指不沾阳春水的。也见过 C-section之后
遵医嘱,至少要6周张伤口,3个月不能剧烈运动的。还见过生产完一周,一边抱着孩子
,一边在办公室干活,一边吃止疼药的。
男faculty在照顾妈妈和孩子的问题上,也有各种不同做法。有的极端是完全两地,太
太生孩子似乎是一个不相关的事情 -- 也许是毫不关心,也许是毫无选择;有的极端是
24小时好先生好爸爸 -- 也许是事业无忧,也许是愿意牺牲。绝大部分人,大概是在端
点中间。
所以,生活便是如此,有的是不愿意,有的是不能够,还有的是没有选择,不能一概而
论。

【在 a****e 的大作中提到】
: 没错。发考题已经比别的行业时间自由多了,男人在家本来时间就很多。如果还没谈牛
: ,就这那借口,肯定不会给同行有啥好印象。
: 很多中国女人太娇气了,其他族裔女人比较能干耐劳。这边生完孩子出院就都能自理了
: ,中国女人得要别人照顾100天甚至一年。

avatar
O*n
17
anyone can think of a simpler formula?
size = 7
matrix = [[0]*size for i in range(size)]
current = 1
for layer in range(size/2+1):
for offset in range(size-1-2*layer):
matrix[layer][layer+offset] = current
current = current+1
for offset in range(size-1-2*layer):
matrix[layer+offset][size-1-layer] = current
current = current+1
for offset in range(size-1-2*layer):
matrix[size-1-layer][size-1-layer-offset] = current
current = current+1
for offset in range(size-1-2*layer):
matrix[size-1-layer-offset][layer] = current
current = current+1
if size%2:
matrix[size/2][size/2]=current
print repr(matrix)

【在 k*p 的大作中提到】
: 就是打印出来,按行的那种,不需要真的按顺时针挨个打
avatar
i*e
18
比较简单的解法是用一个二维矩阵,然后用 spiral 的方法把矩阵填满,最后一行一行
打印出来。
以下的解法不必要额外空间,给行数和列数就可以马上返回矩阵里的值。
int getVal(int row, int col, int n) {
if (row <= col) {
int k = min(row, n-1-col);
int start = 1 + 4*k*(n- k);
return start + (row - k) + (col - k);
} else {
int k = min(n-1-row, col);
int start = 1 + (n-1)*(2+4*k) - 4*k*k;
return start + (n-1-row-k) + (n-1-col-k);
}
}
void printMatrix(int n) {
for (int r = 0; r < n; r++) {
for (int c = 0; c < n; c++) {
cout << getVal(r, c, n) << " ";
}
cout << endl;
}
}
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
avatar
g*e
19
他的题目是要顺时针打印给定矩阵吧,不一定是从1开始按自然数顺序打印

【在 i**********e 的大作中提到】
: 比较简单的解法是用一个二维矩阵,然后用 spiral 的方法把矩阵填满,最后一行一行
: 打印出来。
: 以下的解法不必要额外空间,给行数和列数就可以马上返回矩阵里的值。
: int getVal(int row, int col, int n) {
: if (row <= col) {
: int k = min(row, n-1-col);
: int start = 1 + 4*k*(n- k);
: return start + (row - k) + (col - k);
: } else {
: int k = min(n-1-row, col);

avatar
k*p
20
thanks! 这是用算的方法?不太容易记住啊
如果用二维矩阵呢?我就是写的二维矩阵的觉得不是很neat

【在 i**********e 的大作中提到】
: 比较简单的解法是用一个二维矩阵,然后用 spiral 的方法把矩阵填满,最后一行一行
: 打印出来。
: 以下的解法不必要额外空间,给行数和列数就可以马上返回矩阵里的值。
: int getVal(int row, int col, int n) {
: if (row <= col) {
: int k = min(row, n-1-col);
: int start = 1 + 4*k*(n- k);
: return start + (row - k) + (col - k);
: } else {
: int k = min(n-1-row, col);

avatar
i*e
21
这是用矩阵来储存,利用 spiral 的形式填满矩阵,最后再一行一行打印。
感觉面试时利用这方法比较直观,不容易出错。
#include
#include
using namespace std;
const int N_MAX = 100;
void fill(int row, int col, int dx, int dy, int startVal, int numToFill, int
mat[][N_MAX]) {
int currVal = startVal;
int endVal = startVal + numToFill - 1;
for (int r = row, c = col; currVal <= endVal; r += dy, c += dx) {
mat[r][c] = currVal;
currVal++;
}
}
void generateMatrix(int n, int mat[][N_MAX]) {
if (n <= 0) return;

int row = 0, col = 0;
int val = 1;
int steps = n-1;
while (steps > 0) {
fill(row, col, 1, 0, val, steps, mat);
val += steps;
fill(row, col+steps, 0, 1, val, steps, mat);
val += steps;
fill(row+steps, col+steps, -1, 0, val, steps, mat);
val += steps;
fill(row+steps, col, 0, -1, val, steps, mat);
val += steps;
row++;
col++;
steps -= 2;
}
// handle special case!
if (steps == 0)
mat[n/2][n/2] = val;
}
int main() {
int mat[N_MAX][N_MAX];
int n = 5;
generateMatrix(n, mat);
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++)
cout << setw(3) << mat[row][col];
cout << endl;
}
return 0;
}
一些常见面试题的答案与总结 -
http://www.ihas1337code.com
avatar
c*t
22
那就两个loop就行了。
第一个loop 是row,
第二个loop是column
第二个loop退出的时候换行。
printMatrix(M[][], n)
{
for (int row=0; row{
for (int col=0; colprintf("%d ", M[row][col]);
printf("\n");
}
}

【在 k*p 的大作中提到】
: 就是打印出来,按行的那种,不需要真的按顺时针挨个打
avatar
k*p
23
拜托,M要生成的,直接打印那没啥说的

【在 c*********t 的大作中提到】
: 那就两个loop就行了。
: 第一个loop 是row,
: 第二个loop是column
: 第二个loop退出的时候换行。
: printMatrix(M[][], n)
: {
: for (int row=0; row: {
: for (int col=0; col: printf("%d ", M[row][col]);

avatar
c*t
24
I wrote this last night. Any comment is welcome!
#include
#include
using namespace std;
const int N_MAX = 100;
void fill_in(int row, int size, int start_val, int** mat)
{
int start_col = row;
if (size == 1)
{
mat[row][start_col] = start_val;
return;
}
// top left to top right.
int size_of_square = (size - row * 2);
for (int i = start_col; i < row + size_of_square; ++i)
{
mat[row][i] = start_val;
++start_val;
}
// top right to bottom right.
for (int i = 1; i < size_of_square; ++i)
{
mat[row + i][start_col + size_of_square - 1] = start_val;
++start_val;
}
// bottom right to bottom left.
for (int i = row + size_of_square - 2; i >= start_col; --i)
{
mat[row + size_of_square - 1][i] = start_val;
++start_val;
}
// bottom left to top left.
for (int i = size_of_square - 2; i > 0; --i)
{
mat[row + i][start_col] = start_val;
++start_val;
}
}
void generate(int n, int** mat)
{
int start_val = 1;
int offset = n;
for (int i = 0; i < n / 2; ++i)
{
fill_in(i, n, start_val, mat);
start_val += 4 * (offset - 1);
offset -= 2;
}
if (n % 2 == 1)
{
mat[n / 2][n / 2] = start_val;
}
}
int main() {
int** matrix = new int*[100];
for (int i = 0; i < 100; ++i)
{
matrix[i] = new int[100];
}
int n = 9;
generate(n, matrix);
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cout << setw(3) << matrix[i][j];
}
cout << endl;
}
return 0;
}
avatar
l*g
25
也可以当作一样的问题解,譬如
n=4,打印矩阵。先定义一个4x4的temporary matrix, 然后做循环把数字按序充填好。
再把matrix按行打印
当然,如果不通过temporay matrix来做,那就不一样了

【在 i**********e 的大作中提到】
: 没搞懂你的问题,
: 到底是顺时钟打印矩阵?或者是打印以下的矩阵?
: 当 n=4,打印:
: 1 2 3 4
: 12 13 14 5
: 11 16 15 6
: 10 9 8 7
: 两个是完全不同的问题。
: 一些常见面试题的答案与总结 -
: http://www.ihas1337code.com

avatar
k*n
26

肯定是nxn吗?有可能是nxm吗?后者似乎要麻烦一些
比如这样的
1 2 3 4 5 6
14 15 16 17 18 7
13 12 11 10 9 8
input是什么?如果是一维数组表示法的话,还得转换一下坐标,虽然也不算什么麻烦事
void printMatrix(const int* matrix, int colNum, int rowNum) {
int direction = 0; // 0:>; 1:v; 2:int hLen = colNum - 1;
int vLen = rowNum - 1;
int x = 0;
int y = 0;
while (hLen > 0 && vLen > 0) {
printVector(matrix, colNum, x, y, direction, (direction % 2 == 0) ? hLen
: vLen);
direction = (direction + 1) % 4;
if (direction == 0) {
hLen -= 2; vLen -= 2;
x++; y++;
}
}
if (hLen == 0 && vLen == 0) {
cout << matrix[y*colNum+x] << "\n";
} else if (hLen == 0 || vLen == 0) {
printVector(matrix, colNum, x, y, direction, (direction % 2 == 0) ? hLen
: vLen);
cout << matrix[y*colNum+x] << "\n";
}
}
void printVector(const int* matrix, int colNum, int& x, int& y, int
direction,
int len) {
switch (direction) {
case(0): {
for (int i=0; icout << matrix[y*colNum+x] << " ";
x++;
}
break;
}
case(1):
... ...
}
}

【在 k*p 的大作中提到】
: 就是打印如下矩阵,自己写得太乱了,求code,见笑了
: 1 2 3 4
: 12 13 14 5
: 11 16 15 6
: 10 9 8 7

avatar
E*0
27
我用C#写的
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace PrintMatrixCsharp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int[,] A=GetMatrix(Convert.ToInt16(input.Text));
PrintMatrix(A, Convert.ToInt16(input.Text));
}
private int[,] GetMatrix(int n)
{
int[,] returnVal;
if (0!=n%2)
{
returnVal=new int[0,0];
return returnVal;
}
if (2 == n)
{
returnVal = new int[,]{{1,2},{4,3}};
return returnVal;
}
int [,] t = GetMatrix(n - 2);
int r, c;
returnVal = new int[n, n];
for ( r=1;rfor (c = 1; c < n - 1; c++)
returnVal[r, c] = t[r - 1, c - 1] + 4 * n - 3;
for (c=0;c{
returnVal[0,c]=c+1;
returnVal[n-1,c]=3*n-2-c;
}
for ( r=1;r{
returnVal[r, 0] = 4 * n - 3 - r;
returnVal[r, n-1] = n + r;
}
return returnVal;
}
private void PrintMatrix(int[,] A, int n)
{
outputBox.Clear();
for (int r = 0; r < n; r++)
{
for (int c = 0; c < n; c++)
{
if (0 ==c )
outputBox.Text = outputBox.Text+A[r,c].ToString();
else
outputBox.Text = outputBox.Text + "," + A[r,c].
ToString();
}
outputBox.Text = outputBox.Text + ";" + "\n";
}
}
private void richTextBox1_TextChanged(object sender, EventArgs e)
{


}
}
}
avatar
E*0
28
输入n=2^k,变量名是input.Text
首先,我用递归得出矩阵A,然后把它打印出来。
我再来写个n*m矩阵的打印。
avatar
E*0
29
private void PrintMatrix(int[,] A, int m, int n)
{
outputBox.Clear();
for (int r = 0; r < m; r++)
{
for (int c = 0; c < n; c++)
{
if (0 ==c )
outputBox.Text = outputBox.Text+A[r,c].ToString();
else
outputBox.Text = outputBox.Text + "," + A[r,c].
ToString();
}
outputBox.Text = outputBox.Text + ";" + "\n";
}
}
private int[,] GetMatrix(int m, int n)
{
int[,] returnVal=new int[m, n];
int r, c;
if (1==m && 1<=n)
{
for (c = 0; c < n; c++)
returnVal[0, c] = c + 1;
return returnVal;
}
else if (2 == m && 1 <= n)
{
for (c = 0; c < n; c++)
{
returnVal[0, c] = c + 1;
returnVal[1, c] = 2 * n - c;
}
return returnVal;
}
else if(1==n&&1<=m)
{
for (r = 0; r < m; r++)
returnVal[r, 0] = r + 1;
return returnVal;
}
else if (2 == n && 1 <= m)
{
returnVal[0, 0] = 1;
for (r = 0; r < m; r++)
returnVal[r, 1] = r + 2;
for (r = 1; r < m; r++)
returnVal[r, 0] = 2 * m+ 1 - r;
return returnVal;
}
int[,] t = GetMatrix(m-2,n - 2);
returnVal = new int[m, n];
for (r = 1; r < m - 1; r++)
for (c = 1; c < n - 1; c++)
returnVal[r, c] = t[r - 1, c - 1] + 2 * m + 2 * n - 4;
for (c = 0; c < n; c++)
{
returnVal[0, c] = c + 1;
returnVal[m - 1, c] = m+2*n - 2 - c;
}
for (r = 1; r < m - 1; r++)
{
returnVal[r, 0] = 2*m+2 * n - 3 - r;
returnVal[r, n - 1] = n + r;
}
return returnVal;
}
private void button2_Click(object sender, EventArgs e)
{
int m = Convert.ToInt16(inputM.Text);
int n = Convert.ToInt16(inputN.Text);
int[,] A= GetMatrix(m, n);
PrintMatrix(A, m, n);
}
avatar
t*r
30
我贴个非递归的解法
// 从外向内螺旋打印1-n
void SpiralPrint(int n){
// 计算二维数组的维数k
int k = ceil(sqrt((float)n));
// 动态分配二维数组
int **a = new int*[k];
for(int m = 0; m < k; m++){
a[m] = new int[k];
}
// 初始化数组元素值为-1
for(int x = 0; x < k; ++x){
for(int y = 0; y < k; ++y) {
a[x][y] = -1;
}
}

// 起始数字
int num = 1;
int flag = 1;
// 起始位置
int i = 0;
int j = 0 ;
// 填数
while(true){
// 所有数都填完了么?
if(num > n)
break;
// 如果当前位置尚未填充,则填充
if(a[i][j] == -1)
a[i][j] = num++ ;
// 寻找下一个可填充位置
// 从左向右
if(flag == 1) {
j++;
// 到达右边界或已经填充过
if(j == k || a[i][j] != -1){
// 列下标会退
j--;
// 到达边界则向下
flag = 2;
}
}
// 从上到下
else if(flag == 2){
i++;
// 到达下边界或已经填充过
if(i == k || a[i][j] != -1){
i--; // 行下标回退
flag = 3; //转向左
}
}
// 从右向左
else if(flag == 3){
j--;
// 到达左边界或已经填充过
if(j == -1 || a[i][j] != -1){
j++; // 列下标前进
flag = 4; // 到达边界则向上
}
}
// 从下向上
else if(flag == 4){
i--;
// 到达上边界或已经填充过
if(i == -1 || a[i][j] != -1){
i++ ; // 行下标前进
flag = 1 ; // 到达边界则向右
}
}
}
// 输出
for(int i = 0; i < k; i++){
for(int j = 0; j < k; j++){
cout << right << setw(3);
if(a[i][j] != -1)
cout << a[i][j];
else
cout << " ";
}

cout << endl;
}
}

【在 k*p 的大作中提到】
: 就是打印如下矩阵,自己写得太乱了,求code,见笑了
: 1 2 3 4
: 12 13 14 5
: 11 16 15 6
: 10 9 8 7

avatar
E*0
31
楼上good idea,但是有个问题就是,输入n不可以为任意数。for example, n为一个质
数。
还有一个问题就是对于一个n可以有很多种排法。比如n=16,可以是4*4的矩阵,也可以
是2*8的矩阵。
所以,我认为,输入应该为两个数r,c(行数和列数).
avatar
l*3
32
贴个简单点的,但是比较长 。。。
==============
#include
#include
#include
#include
using namespace std;
enum direct_t { RIGHT, DOWN, LEFT, UP };
void print_spiral_matrix(int dimX, int dimY)
{
int** matrix = new int*[dimX];
for (int i=0; i{
matrix[i] = new int[dimY];
memset(matrix[i], 0, sizeof(int)*dimY);
}

int num = 1;
direct_t dir = RIGHT;
int i, j;

for (i=j=0; num <= dimX*dimY; ++num)
{
matrix[i][j] = num;
switch (dir)
{
case RIGHT:
++ j;
if (j == dimY || matrix[i][j])
{
--j; ++i;
dir = DOWN;
}
break;

case DOWN:
++ i;
if (i == dimX || matrix[i][j])
{
--i; --j;
dir = LEFT;
}
break;

case LEFT:
-- j;
if (j < 0 || matrix[i][j])
{
++j; --i;
dir = UP;
}
break;

case UP:
-- i;
if (i < 0 || matrix[i][j])
{
++i; ++j;
dir = RIGHT;
}
break;
}
}

for (i = 0; i < dimX; ++i)
{
for (j = 0; j < dimY; ++j)
{
printf("%6d", matrix[i][j]);
}
printf("\n");
}
}
int main(int argc, char* argv[])
{
int dimX = 4;
int dimY = 4;
if (argc > 2)
{
dimX = atoi(argv[1]);
dimY = atoi(argv[2]);
}

if (dimX > 0 && dimY > 0)
{
print_spiral_matrix(dimX, dimY);
}

return 0;
}
avatar
s*y
33
How about this?
print(matrix1, m, n, 0, m-1, 0, n-1);
void print(int matrix[][6], int m, int n, int up, int down, int left, int
right)
{
if ((up < 0) || (down >= m) || (left < 0) || (right >= n))
return;
if (up == down) {
for (int i = left; i <= right; i++)
cout << matrix[up][i] << " " ;
return;
}
if (left == right) {
for (int i = up; i <= down; i++)
cout << matrix[i][left] << " " ;
return;
}
//print left to right
for (int i = left; i <= right; i++)
cout << matrix[up][i] << " " ;
//print up to down
for (int i = up+1; i <= down; i++)
cout << matrix[i][right] << " " ;
//print righ to left
for (int i = right -1; i >= left; i--)
cout << matrix[down][i] << " " ;
//print down to up
for (int i = down-1; i >= up+1; i--)
cout << matrix[i][left] << " " ;
print(matrix, m, n, up+1, down-1, left+1, right -1);
}

【在 E*******0 的大作中提到】
: 楼上good idea,但是有个问题就是,输入n不可以为任意数。for example, n为一个质
: 数。
: 还有一个问题就是对于一个n可以有很多种排法。比如n=16,可以是4*4的矩阵,也可以
: 是2*8的矩阵。
: 所以,我认为,输入应该为两个数r,c(行数和列数).

avatar
W*r
34
Kao,Java的答案:
System.out.println("1 2 3 4");
System.out.println("12 13 14 5");
System.out.println("11 16 15 6");
System.out.println("10 9 8 7");
:D

【在 k*p 的大作中提到】
: 就是打印如下矩阵,自己写得太乱了,求code,见笑了
: 1 2 3 4
: 12 13 14 5
: 11 16 15 6
: 10 9 8 7

avatar
f*t
35
笑了

【在 W**********r 的大作中提到】
: Kao,Java的答案:
: System.out.println("1 2 3 4");
: System.out.println("12 13 14 5");
: System.out.println("11 16 15 6");
: System.out.println("10 9 8 7");
: :D

avatar
b*8
36
以前我写的,测试过:
#include
void main()
{
const int size=7;
int a[size][size];
int x,y,val=0;
for(x=0;xfor(y=x;yfor(y=x;yfor(y=size-x-1;y>x;y--) a[size-x-1][y]=++val;
for(y=size-x-1;y>x;y--) a[y][x]=++val;
}
if (size%2) a[size/2][size/2]=++val;
for(x=0;xfor(y=0;yprintf("\n");
}
getchar();
}
avatar
s*y
37
You assume the col number is the same as row number.

【在 b*******8 的大作中提到】
: 以前我写的,测试过:
: #include
: void main()
: {
: const int size=7;
: int a[size][size];
: int x,y,val=0;
: for(x=0;x: for(y=x;y: for(y=x;y
avatar
b*8
38
稍加修改就可以推广到长宽不等。

【在 s*****y 的大作中提到】
: You assume the col number is the same as row number.
avatar
i*e
39
Good, code 很短,没有 function call,很 efficient。但是面试叫我写这样的 code
我可没信心能一次写对,呵呵。

【在 b*******8 的大作中提到】
: 以前我写的,测试过:
: #include
: void main()
: {
: const int size=7;
: int a[size][size];
: int x,y,val=0;
: for(x=0;x: for(y=x;y: for(y=x;y
avatar
c*n
40
mark
avatar
h*8
41
mark
avatar
p*y
42
这个不错!

【在 b*******8 的大作中提到】
: 以前我写的,测试过:
: #include
: void main()
: {
: const int size=7;
: int a[size][size];
: int x,y,val=0;
: for(x=0;x: for(y=x;y: for(y=x;y
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。