2016年3月17日 星期四

UVA 10684 The jackPot

int num[10000] ; int main() { int n=0 ; while(scanf("%d",&n)!=EOF) { if( n==0 ) break ; for(int i=0 ; i 0 ) { sum += num[i] ; if( sum > max ) max = sum ; }else{ sum = 0 ; } } if( max > 0) printf("The maximum winning streak is %d.\n", max) ; else printf("Losing streak.\n") ; } }

2016年3月8日 星期二

UVA 532 Dungeon Master

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>
using namespace std ;
int L=0, R=0, C=0 ;
char maze[31][31][31] ;
int dis[31][31][31] ;
char start = 'S' ;
char rock = '#' ;
char road = '.' ;
char out = 'E' ;
char line[31] ;
struct position
{
int x ;
int y ;
int z ;
int minute ;
};

struct position startPosition ;
struct position exitPosition ;

struct position getUpPosition( struct position pos)
{
pos.x++ ;
pos.minute++ ;
return pos ;
}

struct position getDownPosition( struct position pos)
{
pos.x-- ;
pos.minute++ ;
return pos ;
}

struct position getLeftPosition( struct position pos)
{
pos.y++ ;
pos.minute++ ;
return pos ;
}

struct position getRightPosition( struct position pos)
{
pos.y-- ;
pos.minute++ ;
return pos ;
}

struct position getForwardPosition( struct position pos)
{
pos.z++ ;
pos.minute++ ;
return pos ;
}

struct position getBackPosition( struct position pos)
{
pos.z-- ;
pos.minute++ ;
return pos ;
}

void bfs(struct position pos)
{
queue<struct position> myQueue ;
myQueue.push(pos) ;

dis[pos.x][pos.y][pos.z] = pos.minute ;
while( !myQueue.empty() ) {
struct position top = myQueue.front() ;
myQueue.pop() ;
if( top.x + 1 <  L && dis[top.x+1][top.y][top.z]==-1 && maze[top.x+1][top.y][top.z]!=rock ) {
struct position upPos = getUpPosition(top) ;
dis[upPos.x][upPos.y][upPos.z] = upPos.minute ;
myQueue.push(upPos) ;
}
if( top.x - 1 >= 0 && dis[top.x-1][top.y][top.z]==-1 && maze[top.x-1][top.y][top.z]!=rock) {
struct position downPos = getDownPosition(top) ;
dis[downPos.x][downPos.y][downPos.z] = downPos.minute ;
myQueue.push(downPos) ;
}
if( top.y + 1 <  R && dis[top.x][top.y+1][top.z]==-1 && maze[top.x][top.y+1][top.z]!=rock) {
struct position lefPos = getLeftPosition(top) ;
dis[lefPos.x][lefPos.y][lefPos.z] = lefPos.minute ;
myQueue.push(lefPos) ;
}
if( top.y - 1 >= 0 && dis[top.x][top.y-1][top.z]==-1 && maze[top.x][top.y-1][top.z]!=rock) {
struct position rightPos = getRightPosition(top) ;
dis[rightPos.x][rightPos.y][rightPos.z] = rightPos.minute ;
myQueue.push(rightPos) ;
}
if( top.z + 1 <  C && dis[top.x][top.y][top.z+1]==-1 && maze[top.x][top.y][top.z+1]!=rock) {
struct position forwardPos = getForwardPosition(top) ;
dis[forwardPos.x][forwardPos.y][forwardPos.z] = forwardPos.minute ;
myQueue.push(forwardPos) ;
}
if( top.z - 1 >= 0 && dis[top.x][top.y][top.z-1]==-1 && maze[top.x][top.y][top.z-1]!=rock) {
struct position backPos = getBackPosition(top) ;
dis[backPos.x][backPos.y][backPos.z] = backPos.minute ;
myQueue.push(backPos) ;
}
}
}



int main()
{

while ( cin.getline(line,30) ) {
char * p = strtok(line, " \t\n") ; L = atoi (p) ;
p = strtok(NULL, " \t\n") ;  R = atoi (p) ;
p = strtok(NULL, " \t\n") ;  C = atoi (p) ;
if( L==0 && R==0 && C==0 ) break ;
for( int i=0 ; i<L ; i++ ) {
for( int j=0 ; j<R; j++) {
cin.getline(line,31) ;
//cout << line << endl ;
for( int k=0 ; k < C ; k++) {
maze[i][j][k] = line[k] ;
if( line[k] == start ) {
startPosition.x = i ;
startPosition.y = j ;
startPosition.z = k ;
}
if( line[k] == out ) {
exitPosition.x = i ;
exitPosition.y = j ;
exitPosition.z = k ;
}
dis[i][j][k] = -1 ;
}
}
cin.getline(line,31) ;
}

startPosition.minute = 0 ;
bfs(startPosition) ;

if( dis[exitPosition.x][exitPosition.y][exitPosition.z] != -1 ) {
cout << "Escaped in " << dis[exitPosition.x][exitPosition.y][exitPosition.z] << " minute(s)." << endl ;
}else
cout << "Trapped!" << endl ;
}

//system("pause");
}


2016年2月20日 星期六

組合遊戲理論(Combinatorial Game Theory)

G ≥ 0 unless there is a right option GR ≤ 0; (所有GR都大於0)
G ≤ 0 unless there is a left option GL ≥ 0;   (所有GL都大於0)


兩個game的相加

G = {GL..|GR....}, H = {HL..|HR....}


在意義上相當兩個獨立盤面,左方玩家可以選擇在其中一個盤面下move


G+H = { GL+H, G+HL   |   GR+H, G+HR }




2016年2月19日 星期五

代數結構理論(Algebraic Structure)

有一個集合R,並有元素 a, b, c 屬於 R,且含有兩種操作(operation)
加法(addition) 以及 乘法(multiplication)
(這邊加法以及乘法不是指一般我們日常生活中的數字加減乘除,可以想像為特屬於該集合R的加法與乘法),且兩個操作皆具有封閉性(closure),也就是a+b仍屬於R,a*b 仍屬於 R 。

若該集合是一個環(Ring),則須遵守以下規則

加法交換律:                a + b = b + a
加法結合律:                a + (b + c) = (a + b) + c
存在加法單位元素 z 使得R中的每一個元素a 有下列特性:
                      a + z = z + a = a
對於每一個元素 a 存在加法反元素b使得:      
                      a + b = z
乘法結合律:
                      a*(b*c)  = (a*b)*c
乘法分配律:
                     a*(b+c) = a*b + a*c
                     (b+c)*a = b*a + c*a

integral domain is a nonzero commutative ring

2016年2月14日 星期日

Visual C++ 在程式中取得目前資料夾

#include <Windows.h> // 要 include 這個才可以使用GetCurrentDirectory
#include <stdio.h>
#include <stdlib.h>
int main()
{
char szDir[256];
GetCurrentDirectory(256,szDir);
printf("%s",szDir);
system("pause");
}

2015年7月27日 星期一

紛紛擾擾

最近台灣不太平安。

無論是去年的服貿、高雄氣爆,還是到現在的八仙氣爆、課綱微調,在這些事件中生理上受傷的絕對是弱勢的族群。

對於這些事件,社會上正反意見都有,但我卻無法決定站在哪一邊了。

我一直認為,每個人都有其立場,只要中心主旨是對社會好的,雖然有時候會選擇一個立場,當合作溝通下來,應該都能達到雙贏的地步。

但一個議題所牽扯到的問題極端複雜,必須對歷史、社會、法律皆須全盤了解,才能知道某一立場所受的委屈是什麼,誰在說謊話,誰在說實話,這實在太費工夫了。

所以在全盤了解之前,我無法決定站在哪一邊了,對不起。


2011年1月24日 星期一

蚊子

我雙翼一振,如同萬馬千軍。

我槍頭一出,匹衡五路英雄。

在黑暗中持續等待,我想,長槍也同樣渴望著血。

無奈是,無數的掌聲, 在墜落的過程品嚐一生的跑馬燈。

想起說書人的兩句:『精彩不亮麗,起落是無常。』

心一橫,就是肝腸寸斷也露出滿足的微笑。

2010年12月3日 星期五

線性人生

有道是:無可奈何花落去,似曾相似燕歸來。

在一個古老的倉房中,隱蔽著一個不為人知的秘密。

 

2010年10月7日 星期四

線性代數 - Eigenvalue的真實義

在線性代數中,eigenvalue一定是一大重點

就讓我們來看看究竟是什麼吧~

所謂『eigen 』有特性、特徵的意思

所以常常會看到中文翻成特徵方程式或是英文以characteristic equation 表示

其實身邊常常會遇到eigenvalue相關的問題,只是不曉得罷了

比如說像吉他的調音就是一種。

讓我們來看看eigenvalue的定義吧~

                       AX=λ
A為一個 nxn  matrix 且 x 為n x 1 的 vector
其中 λ 為scalar,當此方程式有解時
 λ 則稱為 A 的eigenvalue , X 則稱為 A的eigen vector(X須不為0)


* 注意當一個A可以有好幾個eigenvalue以及無數個eigenvector
  而eigenvalue的數目最多有n個(其實應該說有n個,但可能有重複值)

讓我們來看接下來這個例子
       
     
A = [4 -2]
       [1  1]   


AX=λX  => (A-λI)X=0

由於定義上X須不為0,也就是det(x)!=0

這代表 det(A-λI)=0

所以計算結果 λ=3 or 2
eigenvector就很多了,先不在這篇提
要先學會怎麼打矩陣才行

晚安~



2010年8月11日 星期三

C語言中for的運作

相信有寫過C語言的人,一定有使用過for。

但也許對於for裡面的實際運行情形不是很了解,

我覺得對於一個寫程式的人還是有必要知道。

以下面這個例子為例
   for (i=0 ; i<5; i++){
         ....
   }//end for

對於編譯器而言,會先執行 i=0

然後判斷 i是否小於5

最後執行完...的內容後,才會做i++

然後再做i<5的比較

也許這樣講大家不太清楚

下面這個範例會比較好

#include<stdio.h>
#include<stdlib.h>
int main(){
    int k=0;
    int i=0;
    for(i=0;k++,i<5;i++){
       printf("%d\n",i);       
    }//end for
    printf("i=%d k=%d",i,k);
system("pause");
}//end main

執行結果:
0
1
2
3
4
i=5 k=6請按任意鍵繼續 . . .

也就是for迴圈中以分號隔開的三個部份

最前面執行了1次,中間部份執行了6次 , 後面執行了5次

不知道這樣講解大家聽懂了嗎?