2012年3月10日 星期六

a417: 螺旋矩陣

內容 :
輸出一螺旋矩陣。

輸入說明 :
每行有一正整數T,代表有幾組測試資料
接下來有T行, 每行有N、M兩正整數
N為矩陣長寬,就是會有N*N矩陣
M為方向,M=1為順時鐘,M=2為逆時鐘
N範圍為1~100之間

輸出說明 :
把矩陣輸出,矩陣值之間寬度為5,就是[00000]寬度
C++可用setw(5)或C的%5d輸出

範例輸入 :
2
3 1
2 2

範例輸出 :
1 2 3
8 9 4
7 6 5

1 4
2 3

程式碼 :
#include<stdio.h>
#include<stdlib.h>

int main()
{
    int i,j,t,n,m,x,y,loop,times,mode,count;
    int pathx[4] = {1,0,-1,0};
    int pathy[4] = {0,-1,0,1};
    
    while(scanf("%d",&t)==1)
    {        
        while(t--)
        {
            scanf("%d%d",&n,&m);
            
            int **arr = (int**)malloc(sizeof(int *) * n);
            for(i=0; i<n; i++)
                arr[i] = (int*)malloc(sizeof(int) * n);
            
            count = 0;
            loop = (n-1) * 2;
            times = n;
            mode = 0;
            if(m == 1)
            {
                x = 0;
                y = -1;
                for(i=0; i<n; i++)
                {
                    y = y + 1;
                    arr[x][y] = ++count;
                }
            }
            else
            {
                x = -1;
                y = 0;
                for(i=0; i<n; i++)
                {
                    x = x + 1;
                    arr[x][y] = ++count;
                }
            }
            for(i=0; i<loop; i++)
            {
                if(i%2 == 0)
                    times--;
                for(j=0; j<times; j++)
                {
                    if(m == 1)
                    {
                        x = x + pathx[mode];
                        y = y + pathy[mode];
                    }
                    else
                    {
                        x = x + pathy[mode];
                        y = y + pathx[mode];
                    }
                    arr[x][y] = ++count;
                }
                mode = (mode+1) % 4;
            }            
            
            for(i=0; i<n; i++)
            {
                for(j=0; j<n; j++)
                    printf("%5d",arr[i][j]);
                printf("\n");
            }
            if(t != 0)
                printf("\n");
        }
    }        
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a417

a410: 解方程

內容 :
    話說同學們正在學習二元一次方程式。
    二元一次方程式的練習題鋪天蓋地地用向同學們,同學們正苦惱於一次次的四則運算、移        項、合併同類項等等。
    他們知道你很聰明,想請你幫他們編一個解二元一次方程式的程式。
    我們假定二元一次方程式的一般格式如下;(a,b,c,d,e,f為長數,x,y為未知數)
        ax+by=c
        dx+ey=f
    程式讀入a,b,c,d,e,f後,輸出解。
    當然,方程式也有可能存在無解或有無窮解的情况:如果(x,y)没有相對應的實數對滿足方程式則無解;相反,如果(x,y)有多組對應的實數對滿足方程式則有無數解。
    如果無解,就输出“No answer”;如果有無窮解,就輸出“Too many”。

輸入說明 :
    輸入僅1行,包含6个整數,a,b,c,d,e,f。輸入資料保證正確。

輸出說明 :
    如果有解,那麼第1行先輸出“x=”,再輸出x的值,第2行先輸出“y=”,再輸出y的值,均保留2位小數,請參照範例輸出。
    如果無解或有無數解則按要求輸出“No answer”或“Too many”。

範例輸入 :
1 1 2 1 -1 0

範例輸出 :
x=1.00
y=1.00

程式碼 :
#include<stdio.h>

int main()
{
    long a,b,c,d,e,f,temp;
    
    scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
    
    temp = a*e-b*d;
    if(temp == 0)
    {
        if(c*d == a*f)
            printf("Too many\n");
        else
            printf("No answer\n");
    }
    else
    {
        printf("x=%.2f\n",(double)(c*e-b*f)/temp);
        printf("y=%.2f\n",(double)(c*d-a*f)/-temp);
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a410

a248: 新手訓練 ~ 陣列應用

內容 :
    大家都知道,小算盤的小數運算只能算出小數點後三十幾位
    但好奇的桑葉想知道更精準的小數值
    請你幫可憐的桑葉做出可以算出精準的小數運算的程式

輸入說明 :
    每次輸入有三個正整數 a, b, N
    1<= a , b <= 2147483647
    1 <= N <= 10000
    ( 輸入不會超過1000筆 )

輸出說明 :
    請輸出 a / b 的小數運算結果
    精準到小數點後N位
    第N位以後請無條件捨去

範例輸入 :
18467 41 10
26500 6334 10
15724 19169 10
10 5 3

範例輸出 :
450.4146341463
4.1837701294
0.8202827481
2.000

提示 :
    背景知識: 一維陣列
    改編自 a240: 第一題:1 / 17 小數第 n 位

程式碼 :
#include<stdio.h>

int main()
{
    int a,b,i,n;
    char s[10001];
    
    while(scanf("%d%d%d",&a,&b,&n)==3)
    {
        printf("%d",a/b);
        a = a % b;
        if(n > 0)
        {
            for(i=0; i<n; i++)
            {
                a = a * 10;
                s[i] = a / b + '0';
                a = a % b;
            }
            s[i] = '\0';
            printf(".%s",s);
        }
        printf("\n");
    }        
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a248