網頁

2013年12月4日 星期三

c048: Ant on a Chessboard、UVA 10161

 (defun calc-coor (sec) 
   "計算座標函式"
   (if (equal sec 0) 
       (return-from calc-coor))
   ;; 把方格從0秒開始計算
   ;; 再以斜線上的點作為基準(base) 
   ;; 最後計算 基準+位移 即為所求
   (let* (( sec (- sec 1))
         (layer (+ (floor (sqrt sec)) 1))
         (base (* layer (- layer 1)))
         (displace (- sec base))
         (coor (list layer layer)))
     (if (equal (rem layer 2) 1)
        (if (> displace 0) 
            (decf (first coor) displace) 
            (incf (second coor) displace))
         (if (> displace 0) 
            (decf (second coor) displace)
            (incf (first coor) displace)))
     coor
     ))
  
 (defun chess-board ()
   (do ((sec (read) (read))) 
       ((<= sec 0) )
     (format t "~A~%" (calc-coor sec))))  
 
 (chess-board) 
 #include <stdio.h>
 #include <math.h> 
 
 int main(int argc, char *argv[])
 {
        int N ; 
        int layer ; 
        int base ; 
        int displace ; 
        int coor[2] ; 
        while(scanf("%d",&N) && N){
                N-- ; 
                layer = floor(sqrt(N))+1; 
                base = layer*(layer-1) ; 
                displace = N-base ; 
                coor[0] = coor[1] = layer ; 
 
                if(layer%2 == 1) 
                        if(displace > 0)
                                coor[0] -= displace ; 
                        else
                                coor[1] += displace ;
                else
                        if(displace > 0) 
                                coor[1] -= displace ; 
                        else
                                coor[0] += displace ; 
                printf("%d %d\n", coor[0], coor[1]) ;  
        }
        return 0;
 }
 
題目連結:http://zerojudge.tw/ShowProblem?problemid=c048

2013年12月2日 星期一

c045: Rotating Sentences、UVA 490

 #include <stdio.h>
 #include <string.h> 
 #define MAX 101
 char arr[MAX][MAX] ;
 
 int main(int argc, char *argv[])
 {
        memset(arr, '\0', sizeof(arr) ) ; 
        int i, j ;
        int rows = 0; 
        int cols = 0 ; 
        for (i=0; fgets(arr[i], sizeof(arr[i]), stdin) != NULL ; ++i) 
                rows++ ; 
 
        char *pos ; 
        for (i=0 ; arr[i][0]!='\0'; ++i)
        {
                if ((pos=strchr(arr[i], '\n')) != NULL)
                        *pos = '\0';
                if (strlen(arr[i]) > cols)
                        cols = strlen(arr[i]) ; 
        }
        /* 字串由左下開始輸出,先向上輸出,再向右輸出 */ 
        for (i=0; i<cols; ++i)
        {
                for (j=rows-1; j>=0 ; --j) 
                        printf("%c",(arr[j][i]=='\0'?' ':arr[j][i])) ;
                puts("") ; 
        }
 
        return 0;
 }
 (defparameter arr (make-array '(100) :initial-element nil))
 (defparameter rows 0) 
 (defparameter cols 0) 
 
 (defun read-lines () 
 "read lines until eof" 
   (do ((i 0 (incf i) )
        (line (read-line *standard-input* nil 'eof)
             (read-line *standard-input* nil 'eof)))
       ((eql line 'eof) i)
     (setf (aref arr i) line)))
 
 
 (defun max-len-str() 
   (let (( max -1 ))
     (do ((i 0 (incf i)))
        ((>= i rows) max) 
        (if ( > (length (aref arr i)) max ) 
            (setf max (length (aref arr i)))))))
 
 (defun printf() 
   (do ((i 0 (incf i)) ) 
       ((>= i cols)) 
     (do ((j (- rows 1) (decf j))) 
        ((< j 0)) 
       (if (> (length (aref arr j)) i)  
          (princ (aref (aref arr j) i))
          (princ " ") ))
     (princ #\Newline))) 
 
 (defun rotate-string() 
   (setf rows (read-lines)) 
   (setf cols (max-len-str)) 
   (printf))
 
 (rotate-string)  
題目連結:http://zerojudge.tw/ShowProblem?problemid=c045