http://www.javaeye.com/topic/545378?page=1
一个画图程序 要求打印出
int i=5;
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
int i=6
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
我这里加一个限制,i<=25。
题目很简单,大一学生分分钟就能写出来。
语言不限,常规语言都行,C/C++/Java/C#/Ruby/Python/Perl。
代码简洁易懂为佳。(这里算是一个反例: http://www.javaeye.com/topic/557924 )
请各路高手各显神通,我会在第10楼贴出自己的C程序。
> C++, Lua, living in Dalianhttp://sunxiunan.com/http://twitter.com/sagasw
> ------------------------------------
>
> 2009/12/28 Shuo Chen <giantc...@gmail.com>
> > 2009/12/28 Shuo Chen <giantc...@gmail.com>
2009/12/28 Mikster.Z <china...@gmail.com>:
--
Regards.
Chen Ming
唯pos[0]和pos[1] , matrix[next[1]] [next[0]] 有些费解。
pos[0] 应该是 x 坐标吧。那么 matrix[][] 是先列后行?
> 2009/12/28 Tinyfool <tinyf...@gmail.com>
>
> > 跑题跑过分了吧?
>
> > 2009/12/28 Jeffrey Zhao <je...@live.com>
>
> > 如果是Win下工作的兄弟,我建议可以买一个RegexBuddy用,很值。
>
> >> Jeffrey Zhao
> >> Blog:http://www.cnblogs.com/JeffreyZhao/
> >> Twitter:https://twitter.com/jeffz_cn
>
> >> *From:* Dbger <baiyanhu...@gmail.com>
> >> *Sent:* Monday, December 28, 2009 2:44 PM
> >> *To:* pon...@googlegroups.com
> >> *Subject:* Re: [TL] Re: {面试}{技术}一道简单的二维数组面试题
>
> >> 了解,这方面我perl用的比较多些,对正则表达式的支持相当强大。
>
> >> 技术博客:http://debuggingnow.com
> >> 我的豆瓣:http://www.douban.com/people/baiyanhuang/
>
> >> 2009/12/28 sagasw <sag...@gmail.com>
>
> >>> 我个人使用它做一些重复性的小应用程序,就跟用python或者ruby一样。
>
> >>> ------------------------------------
> >>> C++, Lua, living in Dalian
> >>>http://sunxiunan.com/
> >>>http://twitter.com/sagasw
> >>> ------------------------------------
>
> >>> 2009/12/28 Dbger <baiyanhu...@gmail.com>
>
> >>> @sagasw 呵呵,本来就是在转圈嘛
> >>>> lua没怎么用过,在云风的blog里看他对lua相当推崇,你们平时工作中主要用lua做些什么的?
>
> >>>> 技术博客:http://debuggingnow.com
> >>>> 我的豆瓣:http://www.douban.com/people/baiyanhuang/
>
> >>>> 2009/12/28 sagasw <sag...@gmail.com>
>
> >>>>> 没错,其实就是4种状态的互相切换,当然像是转圈。
>
> >>>>> 代码理解起来要容易一些。
>
> >>>>> ------------------------------------
> >>>>> C++, Lua, living in Dalian
> >>>>>http://sunxiunan.com/
> >>>>>http://twitter.com/sagasw
> >>>>> ------------------------------------
>
> >>>>> 2009/12/28 Shuo Chen <giantc...@gmail.com>
> >>>>>> > C++, Lua, living in Dalianhttp://
> >>>>>> sunxiunan.com/http://twitter.com/sagasw
> >>>>>> > ------------------------------------
>
#include <stdio.h>
#include <stdlib.h>
int maze[25][25];
int fill(int start, int left, int up, int right, int down)
{
int now = start;
for (int i = left; i < right; ++i)
maze[i][up] = now++;
for (int i = up; i < down; ++i)
maze[right][i] = now++;
for (int i = right; i > left; --i)
maze[i][down] = now++;
for (int i = down; i > up; --i)
maze[left][i] = now++;
return now;
}
int main(int argc, char* argv[])
{
int N = atoi(argv[1]);
int start = 1;
int left = 0, right = N-1, up = 0, down = N-1;
for (int i = 0; i < N/2; ++i) {
start = fill(start, left, up, right, down);
++left, --right, ++up, --down;
}
if (N % 2 == 1)
maze[left][up] = start;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
printf("%*d ", N < 10 ? 2 : 3, maze[j][i]);
}
printf("\n");
}
}
欢迎批评。
import java.lang.Math;
class practise {
public static void main(String[] arguments) {
for(int cycle = 5;cycle < 26;cycle++) {
int i,j;
int[][] matrix = new int[cycle][cycle];
int shangxian = cycle - 1;
matrix[0][0] = 1;
int kaishi,jieshu,jishu,flag;
jishu = 1;
for(int xunhuan = cycle - 1; xunhuan > 2; xunhuan--){
flag = Math.abs(xunhuan - shangxian);
kaishi = Math.abs(shangxian - xunhuan);
i = flag;
for ( j = kaishi; j < xunhuan + 1;j++){
matrix[i][j] = jishu;
jishu++;
}
jishu--;
j--;
for ( i = kaishi; i < xunhuan + 1;i++){
matrix[i][j] = jishu;
jishu++;
}
jishu--;
flag = Math.abs(flag - shangxian);
i = flag;
for ( j = flag ; j > kaishi;j--){
matrix[i][j] = jishu;
jishu++;
}
for ( i = flag; i > kaishi ;i--){
matrix[i][j] = jishu;
jishu++;
}
}
matrix[cycle/2][cycle/2] = cycle*cycle;
System.out.println("int = " + cycle);
for(i = 0; i < cycle; i++){
for(j = 0;j < cycle;j ++){
System.out.print(matrix[i][j] + " ");
}
System.out.print("\n");
}
System.out.println();
fill in the blanks:
---------------------------8<------------------------------
#include <cstdio>
#include <cstdlib>
// right, down, left, up
static const int dir[4][2] = {{0,1}, {1,0}, {0,-1},{-1,0}};
static int matrix[26][26];
int
main(int argc, char *argv[])
{
int n = 3;
if (argc == 2)
n = atoi(argv[1]);
// fill
for (int i = 1, r = 0, c = 0, d = 0; i <= n * n; i++) {
matrix[r][c] = i;
int nr = r + dir[d][0], nc = c + dir[d][1];
if (nr < 0 || nr >= n || nc < 0 || nc >= n || matrix[nr][nc]) {
d = (d+1) % 4;
nr = r + dir[d][0], nc = c + dir[d][1];
}
r = nr;
c = nc;
}
// print
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
printf("%3d%c", matrix[i][j], j == n - 1 ? '\n' : ' ');
return 0;
}
--------------------------->8------------------------------
or construct it recursively:
---------------------------8<------------------------------
import Text.Printf
import Data.Array
f 0 = []
f 1 = [((1,1),1)]
f n = up ++ right ++ bottom ++ left ++ inner
where up = [((1,i),i) | i <- [1..n]]
right = [((i,n),n+i-1) | i <- [2..n-1]]
bottom = [((n,i),n-i+2*n-1) | i <- [n,n-1..1]]
left = [((i,1),n-i+3*n-2) | i <- [n-1,n-2..2]]
inner = map (\((r,c), x) -> ((r+1,c+1), x+4*n-4)) . f $ n - 2
get n = array ((1,1),(n,n)) $ f n
format :: Int -> String
format n = unlines $ map row [1..n]
where row r = concatMap (\c -> printf "%4d" $ a ! (r, c)) [1..n]
a = get n
main = mapM_ (\n -> putStr $ format n ++ "\n\n") [1..10]
--------------------------->8------------------------------
--
Alecs King
http://www.javaeye.com/topic/545378?page=1
一个画图程序 要求打印出
int i=5;
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
int i=6
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
我这里加一个限制,i<=25。
On Dec 28, 8:29 pm, sagasw <sag...@gmail.com> wrote:
> i < 25 这个限制有什么用?
>
> ------------------------------------
> C++, Lua, living in Dalianhttp://sunxiunan.com/http://twitter.com/sagasw
> ------------------------------------
>
> 2009/12/28 Shuo Chen <giantc...@gmail.com>
On Dec 28, 9:28 pm, sagasw <sag...@gmail.com> wrote:
> 大家可否同时附上*n = 5000*(这个应该需要打印一段时间)时候的整个程序完成需要时间(包括屏幕输出时间,因为有些朋友的时间是一段段输出的)?
>
> 想看看不同语言、不同方法实现差别多大。
>
> 我的lua代码测试结果为
> *666.449秒*,接近11分钟,
#include<iostream>
using namespace std;int main()
{
int k=0;
cout<<"input number"<<endl;
int **a;
int i,j;
cin>>k;a=new int *[k];
for(i=0;i<k;i++)
{
a[i]=new int[k];
}for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
a[i][j]=0;
}/*赋值回形数*/
int col=0,row=0;
int num=1;
int count;
int tempRow;/*
按照顺时针的方式赋值数组
*/
for(i=k;i>=0;i=i-2)
{
tempRow=row;
count=0;
col=row;//i代表每行要赋值的个数
while(count<i)
{
a[row][col]=num;
count++;
num++;
col++;
}col--;
for(row++;row<=col;row++)
{
a[row][col]=num;
num++;
}row--;
for(col--;col>=tempRow;col--)
{
a[row][col]=num;
num++;
}col++;
for(row--;row>tempRow;row--)
{
a[row][col]=num;
num++;
}row=tempRow;
row++;
}
//输出二维数组
for(i=0;i<k;i++)
{
for(j=0;j<k;j++)
{
cout<<" , "<<a[i][j];
}
cout<<endl;
}
return 0;
}
typedef int (*f)(const int,int &,int&);
int right(const int a,int&x,int&y)
{return ++x+y*a;}
int down(const int a,int&x,int&y)
{return x+(++y)*a;}
int left(const int a,int&x,int&y)
{return --x+y*a;}
int up(const int a,int&x,int&y)
{return x+(--y)*a;}
int main()
{
int a=0;
cin>>a;
int *ary=new int[a*a];
int n=1,x=-1,y=0;
f pfs[4]={right,down,left,up};
f pf=0;
for(int idx=0;idx<2*a-1;++idx)
{
pf=pfs[idx%4];
for(int idx2=0;idx2<(a-(idx+1)/2);idx2++)
ary[pf(a,x,y)]=n++;
}
for(int i=0;i<a;++i)
{
for(int j=0;j<a;++j)
cout<<ary[i*a+j]<<'\t';
cout<<endl;
}
}
呵呵,花了半个多小时写的..因为没怎么用过函数指针就蛋疼用用...
On Dec 28, 11:30 am, Shuo Chen <giantc...@gmail.com> wrote:
time ./a.out > /dev/null
On Dec 28, 10:45 pm, sagasw <sag...@gmail.com> wrote:
> 写文件比写屏快,这个
> *真的*
> 不需要指点,
> 我想知道的就是计算加上输出的时间,
> 现在机器的差别应该也不至于差很多,除非你是108核的机器。
>
> 另外,不知道你有没有看我写的:
> *绝大部分用在输出结果上了。*
>
> 因为楼主要求的是"画图",光要求计算或者输出到文件,
> 能合乎题目么?给我解释80*25什么的不也是因为要屏显么?
>
> ------------------------------------
> C++, Lua, living in Dalianhttp://sunxiunan.com/http://twitter.com/sagasw
> ------------------------------------
>
> 2009/12/28 Wu Yin <wyw...@gmail.com>
>
> > 你那叫输出到屏幕上了。
> > 你往文件里写个看看,保证速度有质的飞跃
>
> > 2009/12/28 sagasw <sag...@gmail.com>
>
> >> 大家可否同时附上*n = 5000*(这个应该需要打印一段时间)时候的整个程序完成需要时间(包括屏幕输出时间,因为有些朋友的时间是一段段输出的)?
>
> >> 想看看不同语言、不同方法实现差别多大。
>
> >> 我的lua代码测试结果为
> >> *666.449秒*,接近11分钟,
> >> 2009/12/28 Shuo Chen <giantc...@gmail.com>
>
> >>> 屏幕一行80列。
>
> >>> On Dec 28, 8:29 pm, sagasw <sag...@gmail.com> wrote:
> >>> > i < 25 这个限制有什么用?
>
> >>> > ------------------------------------
> >>> > C++, Lua, living in Dalianhttp://
> >>> sunxiunan.com/http://twitter.com/sagasw
> >>> > ------------------------------------
>
On Dec 28, 10:46 pm, sagasw <sag...@gmail.com> wrote:
> 把你的机器配置写出来就好了,
> 机器配置能影响多少呢?
>
> ------------------------------------
> > > > > C++, Lua, living in Dalianhttp://
> > sunxiunan.com/http://twitter.com/sagasw
> > > > > ------------------------------------
>
On Dec 28, 9:28 pm, sagasw <sag...@gmail.com> wrote:
> 大家可否同时附上*n = 5000*(这个应该需要打印一段时间)时候的整个程序完成需要时间(包括屏幕输出时间,因为有些朋友的时间是一段段输出的)?
>
> 想看看不同语言、不同方法实现差别多大。
>
> 我的lua代码测试结果为
> *666.449秒*,接近11分钟,
struct Matrix
{
std::vector<int> vData;
int size_;
explicit Matrix(int size)
: vData(size*size), size_(size)
{}
int& operator()(int y, int x)
{
return vData[y*size_+x];
}
};
void main()
{
int n = 0;
printf("Input n:");
scanf("%d", &n);
Matrix mat(n);
int y=0,x=0;
int inc[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int id=0;
for(int i=0; i<n*n; i++)
{
assert(!(x<0 || x>=n || y<0 || y>=n || mat(y,x)));
mat(y,x) = i+1;
//printf("y %d x %d data %d\n", y, x, i+1);
int dx=inc[id%4][0];
int dy=inc[id%4][1];
if(x+dx<0 || x+dx>=n || y+dy<0 || y+dy>=n || mat(y+dy,x+dx))
{
id++;
dx=inc[id%4][0];
dy=inc[id%4][1];
}
x+=dx;
y+=dy;
}
for(y=0; y<n; y++)
{
for(int x=0; x<n;x++)
{
printf("%4d", mat(y,x));
}
printf("\n");
}
}
On Dec 28, 11:18 pm, sagasw <sag...@gmail.com> wrote:
> 我在你另外的帖子里回复过题意不清的意见,
> 不知道你有没有看过前面朋友的回答,有的人是把结果存入某个表、数组,
> 有的就直接打印出来了,
> 我是第一次知道画图是把结果写到文件里,这点算是我有些抬杠。
> 既然你说抛开IO,那为何还要写文件,难道写文件不是IO,抱歉,这点又是抬杠。
>
> 干脆不如这样,直接算完就拉倒,也不写文件,也不屏显,最能体现不同计算方式的性能。
>
> 当然,这些都是无所谓、瞎扯罢了。
>
> ------------------------------------
> > > > > C++, Lua, living in Dalianhttp://
> > sunxiunan.com/http://twitter.com/sagasw
> > > > > ------------------------------------
>
#include <iostream>
#include <time.h>
#define MAX 5000
using namespace std;
int array[MAX][MAX] = { {0} };
void output_array( int array[MAX][MAX], int n ) {
for ( int i = 0; i < n; ++i ) {
for ( int j = 0; j < n; ++j ) {
cout << array[i][j] << "\t";
}
cout << endl;
}
cout << endl;
}
void play_game() {
long i;
cout << "Input the number: ";
cin >> i;
int clock1 = clock();
int row = 0, col = 0;
int k = i;
int j = k;
int flag = 0;
for ( long index = 0; index < i * i; index++ ) {
if ( --j <= 0 ) {
if ( flag % 2 == 0 ) {
j = --k;
} else {
j = k;
}
flag++;
}
array[row][col] = index+1;
switch( flag % 4 ) {
case 0:
col++;
break;
case 1:
row++;
break;
case 2:
col--;
break;
case 3:
row--;
break;
}
}
int clock2 = clock();
cout << "Time: " << clock2 - clock1 << endl;
output_array( array, i );
int clock3 = clock();
cout << "Time: " << clock3 - clock1 << endl;
}
int main() {
while( 1 ) {
play_game();
}
return 0;
}
--
iStone
http://meiyou.org
On Dec 29, 7:48 am, Yishi Guo <baicaib...@gmail.com> wrote:
int fill(int start, int left, int up, int right, int down)
{
int n = right-left;
for (int i = 0; i < n; ++i) {
maze[left+i][up] = start+i;
maze[right][up+i] = start+i+n;
maze[right-i][down] = start+i+2*n;
maze[left][down-i] = start+i+3*n;
}
return start + 4*n;
}
程序的结果不变,但是速度略有变化,问:你认为可能变快还是变慢?为什么?
On Dec 28, 4:35 pm, Shuo Chen <giantc...@gmail.com> wrote:
> 把我自己的贴一下,C 写的,非递归版。
>
> #include <stdio.h>
> #include <stdlib.h>
>
> int maze[25][25];
>
> int fill(int start, int left, int up, int right, int down)
> {
> int now = start;
> for (int i = left; i < right; ++i)
> maze[i][up] = now++;
> for (int i = up; i < down; ++i)
> maze[right][i] = now++;
> for (int i = right; i > left; --i)
> maze[i][down] = now++;
> for (int i = down; i > up; --i)
> maze[left][i] = now++;
> return now;
>
> }
>
> int main(int argc, char* argv[])
> {
> int N = atoi(argv[1]);
> int start = 1;
> int left = 0, right = N-1, up = 0, down = N-1;
>
> for (int i = 0; i < N/2; ++i) {
> start = fill(start, left, up, right, down);
> ++left, --right, ++up, --down;
> }
>
> if (N % 2 == 1)
> maze[left][up] = start;
>
> for (int i = 0; i < N; ++i) {
> for (int j = 0; j < N; ++j) {
> printf("%*d ", N < 10 ? 2 : 3, maze[j][i]);
> }
> printf("\n");
> }
>
> }
>
> 欢迎批评。
>
> On Dec 28, 11:30 am, Shuo Chen <giantc...@gmail.com> wrote:
>
int fill(int start, int left, int up, int right, int down)
{
int n = right-left;
for (int i = 0; i < n; ++i) {
maze[left][up+i+1] = start-i-1+4*n;
maze[right][up+i] = start+i+n;
maze[left+i][up] = start+i;
maze[left+i+1][down] = start-i-1+3*n;
}
return start + 4*n;
}
前一次变了10%,这次变了4%。一次变快一次变慢,问你觉得哪次快哪次慢?
#include <iostream>
using namespace std;
int main()
{
int a[26][26],n,i,j,c,p,q;
while(1)
{
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=0;
for(c=2,i=j=0,p=0,q=1,a[i][j]=1;c<=n*n;c++)
{
i+=p;
j+=q;
a[i][j]=c;
if((a[i+p][j]&&a[i][j]!=(a[i+p][j]-1)&&a[i][j]!=a[i+p][j])||i+p==n||
i+p<0)
{
if(p==1)
{
p=0;
q=-1;
}
else
{
p=0;
q=1;
}
}
else if((a[i][j+q]&&a[i][j]!=(a[i][j+q]-1)&&a[i][j]!=a[i][j+q])||j
+q==n||j+q<0)
{
if(q==1)
{
p=1;
q=0;
}
else
{
p=-1;
q=0;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%3d ",a[i][j]);
import java.util.*;
public class HelixMatrix
{
private static int size;
public static void fillCol(int row, int col, int fill, boolean
direction, int offset, int[][] matrix)
{
if (offset <= size)
{
int step = (direction ? 1 : -1);
// System.out.println("fillCol() called\nStart with row "+row
+" col "+col+" step "+step);
for(int i = 0;i < size-offset;i++)
{
matrix[row][col] = fill++;
row += step;
}
fillRow(row-step, col-step, fill, !direction, offset,
matrix);
}
}
public static void fillRow(int row, int col, int fill, boolean
direction, int offset, int[][] matrix)
{
if (offset <= size)
{
int step = (direction ? 1 : -1);
// System.out.println("fillRow() called\nStart with row "+row
+" col "+col+" step "+step);
for(int i = 0;i < size-offset;i++)
{
matrix[row][col] = fill++;
col += step;
}
fillCol(row+step, col-step, fill, direction, offset+1,
matrix);
}
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
size = sc.nextInt();
int[][] matrix = new int[size][size];
int fill = 1;
for(int i = 0;i < size;i++)
matrix[0][i] = fill++;
fillCol(1, size-1, fill, true, 1, matrix);
printMatrix(matrix);
}
public static void printMatrix(int[][] matrix)
{
String format = new String();
int length = 3 + (int) Math.floor(Math.log10(size));
format = "%"+length+"d";
for(int i = 0;i < size;i++)
{
for(int j = 0;j < size;j++)
{
System.out.print(new String().format(format, matrix[i]
[j]));
}
System.out.print("\n");
}
}
}
On Dec 29, 8:19 pm, "Mikster.Z" <chinamix...@gmail.com> wrote:
> 未必吧~~拟合出一条定义在X,Y上的螺旋曲线就可以O(n),但是我不会弄~~~也不知道能不能弄~~ :)
>
> 2009/12/29 jun lin <linjunhal...@gmail.com>
>
>
>
> > 转圈要消耗n**2的空间和时间,
> > 直接算的话,消耗常数的空间和n**2的时间。。。。
>
> > 2009/12/29 jun lin <linjunhal...@gmail.com>
>
> >> 主要是逻辑上差不多。。。
> >> 这道题的解法好像有2个,按照题目的方法来转圈,
> >> 或者直接算结果?
>
> >> 2009/12/29 Simon Liu <yuntao....@gmail.com>
>
> >>> 是啊 都是Python的
>
> >>> 2009/12/29 jun lin <linjunhal...@gmail.com>
>
> >>> 感觉像是我写的精简版本。。
> >>>> +1
>
> >>>> 2009/12/29 Simon Liu <yuntao....@gmail.com>
比如我这个:
struct Point
{
int x, y;
};
int getLayer(int N, int i)
{
return static_cast<int>(ceil((N - sqrt(N*N - i))/2));
}
int sumLayer(int N, int layer)
{
return layer*4*(N - layer);
}
Point calc(int N, int i)
{
int layer = getLayer(N, i);
int sum = sumLayer(N, layer-1);
int offset = i - sum - 1;
int row = N+1-2*layer;
Point p;
if (row == 0) {
p.x = layer - 1;
p.y = layer - 1;
} else {
int region = offset / row;
int delta = offset % row;
switch (region) {
case 0:
p.x = layer-1+delta;
p.y = layer-1;
break;
case 1:
p.x = N-layer;
p.y = layer-1+delta;
break;
case 2:
p.x = N-layer-delta;
p.y = N-layer;
break;
case 3:
p.x = layer-1;
p.y = N-layer-delta;
break;
default:
assert(0 && "Unknown region");
break;
}
}
return p;
}
int main(int argc, char* argv[])
{
int N = atoi(argv[1]);
for (int i = 1; i <= N*N; ++i) {
Point p = calc(N, i);
printf("%d %d %d\n", i, p.x, p.y);
}
}
On Dec 30, 5:21 pm, line head <luckheadl...@gmail.com> wrote:
> ms好久前在一个叫啥程序员面试宝典里看到过这个
> 环形数组,我想知道通项公式如何求出,而不是用模拟的方法。通项的话,参数是整数数值和行或列的数量,输出为i,j。
>
> 2009/12/29 Shuo Chen <giantc...@gmail.com>
2009/12/31 Mikster.Z <china...@gmail.com>:
然后也要花上10分钟的时间来看懂?
贴一个C的:#include <stdio.h>#define N 5int main(){int type, i, j, n, t[N+2][N+2];type=3;n=1;for(i=0;i<N+2;i++)for(j=0;j<N+2;j++)t[i][j]=0;for(j = 0; j < N+2; j++)t[0][j] = t[N+1][j] = 1;for(i = 1; i < N+2; i++)t[i][0] = t[i][N+1] =1;i=j=0;while(n < N*N){while(type == 3){t[i+1][j+1] = n;if(t[i+1][j+2]){type = 1;break;}j++;n++;}while(type == 1){t[i+1][j+1]=n;if(t[i+2][j+1]){type = 2;break;}i++;n++;}while(type == 2){t[i+1][j+1]=n;if(t[i+1][j]){type = 0;break;}j--;n++;}while(type == 0){t[i+1][j+1]=n;if(t[i][j+1]){type = 3;break;}i--;n++;}}for(i=1;i<N+1;i++){for(j=1;j<N+1;j++)printf("%4d",t[i][j]);printf("\n");}return 0;}2009/12/29 Shuo Chen <gian...@gmail.com>
再改了一次,这次速度有相反的变化,问为什么?
maze[left][up+i+1] = start-i-1+4*n;
int fill(int start, int left, int up, int right, int down)
{
int n = right-left;
for (int i = 0; i < n; ++i) {
maze[right][up+i] = start+i+n;maze[left+i+1][down] = start-i-1+3*n;
maze[left+i][up] = start+i;
}
return start + 4*n;
}
前一次变了10%,这次变了4%。一次变快一次变慢,问你觉得哪次快哪次慢?
On Dec 29, 11:23 am, Shuo Chen <giantc...@gmail.com> wrote:
> 小测试:
> 我把 fill() 从四个循环改为一个循环:
>
> int fill(int start, int left, int up, int right, int down)
> {
> int n = right-left;
> for (int i = 0; i < n; ++i) {
> maze[left+i][up] = start+i;
> maze[right][up+i] = start+i+n;
> maze[right-i][down] = start+i+2*n;
> maze[left][down-i] = start+i+3*n;
> }
> return start + 4*n;
>
> }
>
> 程序的结果不变,但是速度略有变化,问:你认为可能变快还是变慢?为什么?
>
> On Dec 28, 4:35 pm, Shuo Chen <giantc...@gmail.com> wrote:
>
> > 把我自己的贴一下,C 写的,非递归版。
>
> > #include <stdio.h>
> > #include <stdlib.h>
>
> > int maze[25][25];
>
> > int fill(int start, int left, int up, int right, int down)
> > {
> > int now = start;
> > for (int i = left; i < right; ++i)
> > maze[i][up] = now++;
> > for (int i = up; i < down; ++i)
> > maze[right][i] = now++;
> > for (int i = right; i > left; --i)
> > maze[i][down] = now++;
> > for (int i = down; i > up; --i)
> > maze[left][i] = now++;
> > return now;
>
> > }
>
> > int main(int argc, char* argv[])
> > {
> > int N = atoi(argv[1]);
> > int start = 1;
> > int left = 0, right = N-1, up = 0, down = N-1;
>
> > for (int i = 0; i < N/2; ++i) {
> > start = fill(start, left, up, right, down);
> > ++left, --right, ++up, --down;
> > }
>
> > if (N % 2 == 1)
> > maze[left][up] = start;
>
> > for (int i = 0; i < N; ++i) {
> > for (int j = 0; j < N; ++j) {
> > printf("%*d ", N < 10 ? 2 : 3, maze[j][i]);
> > }
> > printf("\n");
> > }
>
> > }
>
> > 欢迎批评。
>
> > On Dec 28, 11:30 am, Shuo Chen <giantc...@gmail.com> wrote:
>
> > > 年底了,轻松一下。
>
> > >http://www.javaeye.com/topic/545378?page=1
>
> > > 一个画图程序 要求打印出
>
> > > int i=5;
> > > 1 2 3 4 5
> > > 16 17 18 19 6
> > > 15 24 25 20 7
> > > 14 23 22 21 8
> > > 13 12 11 10 9
>
> > > int i=6
> > > 1 2 3 4 5 6
> > > 20 21 22 23 24 7
> > > 19 32 33 34 25 8
> > > 18 31 36 35 26 9
> > > 17 30 29 28 27 10
> > > 16 15 14 13 12 11
>
> > > 我这里加一个限制,i<=25。
>
> > > 题目很简单,大一学生分分钟就能写出来。
> > > 语言不限,常规语言都行,C/C++/Java/C#/Ruby/Python/Perl。
> > > 代码简洁易懂为佳。(这里算是一个反例:http://www.javaeye.com/topic/557924)
> > > 请各路高手各显神通,我会在第10楼贴出自己的C程序。
--
王大鹏
HUST,Wuhan,China
博客:wong2.cn
Twitter:twitter.com/wonderfuly
int g_array[N][N];
/* start is the value in (i,j)
* size is the length of this box*/
void setBox(int start, int size, int i, int j)
{
int index=1;
int value = start;
/*set the top*/
for(;index<size;index++)
{
g_array[i][j++] = value++;
}
/*set the right*/
for(index=1;index<size;index++)
{
g_array[i++][j] = value++;
}
/*set the bottom*/
for(index=1;index<size;index++)
{
g_array[i][j--] = value++;
}
/*set the left*/
for(index=1;index<size;index++)
{
g_array[i--][j] = value++;
}
return;
}
int main(int argc, char **argv)
{
int i,j;
int box=0;
int start = 0;
g_array[0][0]=1;
i=0;j=0;
start = g_array[0][0];
do
{
setBox(start, N-box*2, i, j);
box++;
i = box; j = box;
start = g_array[i][j-1]+1;
}while(box<MAX_BOXES);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%4d", g_array[i][j]);
}
printf("\n");
}
getchar();
return 0;
}
On Jan 4, 5:32 pm, Kenny Yuan <yuankain...@gmail.com> wrote: