2010年7月30日 星期五

排列組合二

排列組合二
從檔案in.txt第一列讀入排列組合的項目n個,再讀入第二列數字m,從n個項目中,取出m個項目的組合,全部輸出到out.txt中。
輸入範例:
a b c 1 x
2

輸出範例:
ab
ac
a1
ax
bc
b1
bx
c1
cx
1x

排列組合一

排列組合一
從檔案 in.txt 讀入排列組合的項目,將所有可能的排列輸出到out.txt。
輸入範例:
a b c 1

輸出範例:
abc1
bac1
cab1
1abc
acb1
a1bc
bca1
b1ac
cba1
c1ab
1bac
1cab
ab1c
ba1c
ca1b
1acb
ac1b
a1cb
bc1a
b1ca
cb1a
c1ba
1bca
1cba

2010年7月23日 星期五

兩直線間的關係

兩直線間的關係
在2維平面中兩條直線間的關係共有3種:
1.相交於一點
2.重疊
3.平行
輸入4個點,分別為兩條直線。
輸出兩條直線的關係。
輸入說明:
每組輸入包含8個數字,x1 y1 x2 y2 x3 y3 x4 y4 ,代表4個點(x1,y1)..(x4,y4)
一條直線會通過(x1,y1)、(x2,y2), 另一條線通過另外兩點。
輸出說明:
請輸出1或2或3,分別代表1.相交於一點,2.重疊,3.平行。
輸入範例:
4 2 0 2 1 -1 2 2
1 3 2 4 -1 1 -2 0
3 5 0 2 1 5 -1 3
輸出範例:
1
2
3

文字繞圈圈


文字繞圈圈
輸入一個字串,請找出可以將這個字串填入的最小正方形,而填入的方式是由正方形的左上角開始,順時鐘方向,由外向內填入。
輸入說明:
 每組輸入包含一列字串,字串內的字元都是英數字,長度小於100。
輸出說明:
 對於每組測試資料,輸出填入最小正方形後的結果,每組測試資料以一列空白隔開。
輸入範例:
 0123456789abcde
1111111111111111222222223

輸出範例:
0123
bcd4
a e5
9876

11111
12221
12321
12221
11111

2010年7月16日 星期五

數獨

數獨
 數獨說明(略)。
 請設計一個程式,可以幫助玩家提示空格中尚可填入的數字。
 例如,(如輸入範例test3.txt),第5行第3列的位置尚可填入1這個數字;第6行第7列的位置尚可填入7與8這兩個數字;而第5行第5列的位置已有數字填入則輸出0。
 輸入說明:
 輸入的第一列到第九列為數獨資料,每一列由九個數字所組成。數字1到9為已填入的數字,0代表尚未填入數值的空格,每個數字與數字間的區隔為一個空白符號。第十列及以後的資料為要提示位置的座標(座標的定義方式為右上角為9 1,左下角為1 9,第一個數字代表行,第二個數字代表列),當為0 0 時表示結束。
 輸入範例:test3.txt
4 0 0 8 0 5 0 1 0 
2 0 0 0 0 9 0 8 0
6 0 8 0 0 3 4 9 0
0 0 5 0 2 0 6 0 0 
0 0 1 0 7 0 9 0 0
0 0 7 0 8 0 3 0 0
0 9 0 1 0 0 0 0 2
0 8 0 4 0 0 0 0 9
0 3 0 6 0 2 0 0 7
5 3
6 7
5 5
0 0 
 輸出說明:每個提示位置有一列輸出結果,表示尚可填入的數字,請由小到大排列。每個數字與數字間的區隔為一個空白符號。若該位置已有填入數字,或找不到提示的數字則輸出0。
 輸出範例:result3.txt
1
7 8
0

額外說明:
1.這題雖然前面已經做過數獨遊戲了,但是一來每個人還沒做解題的部份;二來用以往的競賽題目,來了解題目可以怎麼出。
2.還是要再提醒每個人,不可以只用這樣的一個例子去解而已。要自己再加輸入例子,再將輸出的結果也一併貼出來。
3.尤其要注意「邊界值」,像這題的1 1和9 9或是9 1或是1 9。像前一題總和檢查時,要注意的邊界值就是用100個數字的數列及用2個數字的數列來當成是輸入例子。

熊掌
數獨輸入資料錯誤修正

總和檢查

總和檢查
 請檢查一個數列中,尋找任兩個數字相加後的和是否會等於輸入的檢查值。
 例如,有一個數列為8,20,27,17,13,28,35,31,若輸入的檢查值為48,會找到20及28兩個數,相加的和為48;反之若輸入的檢查值為50,則會找不到配對的數字。
 輸入說明:
 輸入之第一列為下一列數列中的個數,第二列為數列資料。每個數字與數字間的區隔為一個空白符號。第三列及以後的資料為輸入的檢查值,每一列有一個檢查值,當為0時表示結束。
 輸入範圍:
 輸入的數列最少有2個數字,最多不超過100個。每個數列中的數字皆大於0,小於1000,且不重覆。
 輸入範例:test2.txt
8
8 20 27 17 13 28 35 31
48
50
59
0
 輸出說明:
 每個檢查值有一個輸出結果,若有匹配的檢查值,則輸出為1,反之為-1。
 輸出範例:result2.txt
1
-1
1

額外說明:
1.請每人在貼上來的程式裡,form_load()或form_activate()中的第一行要加上,
form.hide
最後一行要加上,
end
,也就是說,執行時,什麼都看不到,也會自動結束。
2.這幾個星期,原則以每星期2題,主要利用星期六日來做。
3.學科考試以總複習的第4章全部。所以,全部的題目都要做,輔導課結束,拿給我檢查,當然,如果有不懂的題目也可以問的。

熊掌

2010年6月24日 星期四

解數獨

解數獨程式:
下載程式表單檔

Dim orig(81) As String
Dim gameOver As Boolean, Repe As Boolean
Const g1 = "410709600286035097007000200000501040030007528900000100740203069168000050300008014"
Const g2 = "000500010008603000090070308000000200005016804034200001040008000000100795760952000"
Const g3 = "601580000000000020000030000400000900980400050305002014700000100000620049204070580"

Private Sub Command1_Click()
 gameOver = False
 For i = 1 To 81
  a = Mid(g1, i, 1)
  orig(i) = a
  If a = 0 Then
    T1(i).Text = ""
  Else
    T1(i).Text = a
    T1(i).ForeColor = RGB(200, 0, 0)
  End If
 Next
End Sub

Private Sub Command2_Click()
For i = 1 To 81
 If T1(i).Text = "" Then
All = "123456789"
 a = (i - 1) \ 9 + 1
 b = (i - 1) Mod 9 + 1

 For x = 1 + (a - 1) * 9 To a * 9
  'T1(i).BackColor = vbRed
  If i <> x Then
   All = Replace(All, T1(x), "")
  End If
 Next x

 For x = b To 81 Step 9
   If i <> x Then
    All = Replace(All, T1(x), "")
   End If
 Next x
 '九個小區的檢查是否重複(n,m)=(1,1)~(3,3) 共九區
'(1,1),(1,2),(1,3)
'(2,1),(2,2),(2,3)
'(3,1),(3,2),(3,3)
n = (a - 1) \ 3 + 1
m = (b - 1) \ 3 + 1

'Print "("; n; ","; m; ")"
For z = 1 + (n - 1) * 27 To 19 + (n - 1) * 27 Step 9
 For x = z + (m - 1) * 3 To z + 2 + (m - 1) * 3
  If i <> x Then
   All = Replace(All, T1(x), "")
  End If
 Next x
Next z
 'MsgBox All
 If Len(All) = 1 Then T1(i).Text = All
End If
Next i
End Sub

Private Sub Command3_Click()
 gameOver = False

 For i = 1 To 81
  a = Mid(g2, i, 1)
  orig(i) = a
  If a = 0 Then
    T1(i).Text = ""
  Else
    T1(i).Text = a
    T1(i).ForeColor = RGB(200, 0, 0)
  End If
 Next

End Sub

Private Sub Command4_Click()
 gameOver = False

For i = 1 To 81
  a = Mid(g3, i, 1)
  orig(i) = a
  If a = 0 Then
    T1(i).Text = ""
  Else
    T1(i).Text = a
    T1(i).ForeColor = RGB(200, 0, 0)
  End If
 Next
End Sub

Private Sub Command5_Click()
Dim kk(81) As Integer
Dim kkdata(81) As Integer
For i = 1 To 81
 If T1(i).Text <> "" Then
  kk(i) = 1
 Else
  kk(i) = 2  '等於2時,才是需要猜的格子
  kkdata(i) = 0
 End If
Next i
i = 1
Do
'If i Mod 20 = 0 Then MsgBox i
If kk(i) = 1 Then
 i = i + 1
Else
 Do
  kkdata(i) = kkdata(i) + 1
  T1(i).Text = kkdata(i)
  'MsgBox i & "," & kkdata(i)
 Loop Until Repe = False Or kkdata(i) >= 9
 If Repe = False Then
 i = i + 1
 Else
  Do
   kkdata(i) = 0
   i = i - 1
  
  Loop Until kk(i) = 2
 End If
End If
Loop Until gameOver = True
End Sub
Private Sub mygues()
ag:
achang = False
For i = 1 To 81
 If T1(i).Text = "" Then
All = "123456789"
 a = (i - 1) \ 9 + 1
 b = (i - 1) Mod 9 + 1

 For x = 1 + (a - 1) * 9 To a * 9
  'T1(i).BackColor = vbRed
  If i <> x Then
   All = Replace(All, T1(x), "")
  End If
 Next x

 For x = b To 81 Step 9
   If i <> x Then
    All = Replace(All, T1(x), "")
   End If
 Next x
 '九個小區的檢查是否重複(n,m)=(1,1)~(3,3) 共九區
'(1,1),(1,2),(1,3)
'(2,1),(2,2),(2,3)
'(3,1),(3,2),(3,3)
n = (a - 1) \ 3 + 1
m = (b - 1) \ 3 + 1

'Print "("; n; ","; m; ")"
For z = 1 + (n - 1) * 27 To 19 + (n - 1) * 27 Step 9
 For x = z + (m - 1) * 3 To z + 2 + (m - 1) * 3
  If i <> x Then
   All = Replace(All, T1(x), "")
  End If
 Next x
Next z
 'MsgBox All
 If Len(All) = 1 Then T1(i).Text = All: achang = True
 If Len(All) = 2 Then
    T1(i).Text = Mid(All, 2, 1)
    achang = True
 End If
End If
Next i
If achang Then GoTo ag
End Sub
Private Sub Command6_Click()
ag:
achang = False
For i = 1 To 81
 If T1(i).Text = "" Then
All = "123456789"
 a = (i - 1) \ 9 + 1
 b = (i - 1) Mod 9 + 1

 For x = 1 + (a - 1) * 9 To a * 9
  'T1(i).BackColor = vbRed
  If i <> x Then
   All = Replace(All, T1(x), "")
  End If
 Next x

 For x = b To 81 Step 9
   If i <> x Then
    All = Replace(All, T1(x), "")
   End If
 Next x
 '九個小區的檢查是否重複(n,m)=(1,1)~(3,3) 共九區
'(1,1),(1,2),(1,3)
'(2,1),(2,2),(2,3)
'(3,1),(3,2),(3,3)
n = (a - 1) \ 3 + 1
m = (b - 1) \ 3 + 1

'Print "("; n; ","; m; ")"
For z = 1 + (n - 1) * 27 To 19 + (n - 1) * 27 Step 9
 For x = z + (m - 1) * 3 To z + 2 + (m - 1) * 3
  If i <> x Then
   All = Replace(All, T1(x), "")
  End If
 Next x
Next z
 'MsgBox All
 If Len(All) = 1 Then T1(i).Text = All: achang = True
End If
Next i
If achang Then GoTo ag
End Sub

Private Sub Form_Load()
For i = 0 To 81: T1(i).Text = "": orig(i) = 0: Next
End Sub

Private Sub T1_Change(Index As Integer)
i = Index
Repe = False
If T1(i).Text >= "1" And T1(i).Text <= "9" _
 And Len(T1(i).Text) = 1 And orig(i) = "0" Then
 '第a橫排 第b直排
 a = (i - 1) \ 9 + 1
 b = (i - 1) Mod 9 + 1

 For x = 1 + (a - 1) * 9 To a * 9
  'T1(i).BackColor = vbRed
  If i <> x And T1(i).Text = T1(x).Text Then
   T1(i).Text = "": Beep: Repe = True
  End If
 Next x

 For x = b To 81 Step 9
   If i <> x And T1(i).Text = T1(x).Text Then
   T1(i).Text = "": Beep: Repe = True
  End If
 Next x

'九個小區的檢查是否重複(n,m)=(1,1)~(3,3) 共九區
'(1,1),(1,2),(1,3)
'(2,1),(2,2),(2,3)
'(3,1),(3,2),(3,3)
n = (a - 1) \ 3 + 1
m = (b - 1) \ 3 + 1

'Print "("; n; ","; m; ")"
For z = 1 + (n - 1) * 27 To 19 + (n - 1) * 27 Step 9
 For x = z + (m - 1) * 3 To z + 2 + (m - 1) * 3
  If i <> x And T1(i).Text = T1(x).Text Then
   T1(i).Text = "": Beep: Repe = True
  End If
 Next x
Next z

'判斷是否結束了
ok = True
For x = 1 To 81
 If T1(x) = "" Then ok = False
Next x
If ok = True Then MsgBox "恭喜您完成了": gameOver = True

Else
 If orig(i) = "0" Then T1(i).Text = "": Repe = True Else T1(i).Text = orig(i)
End If
End Sub

Private Sub T1_GotFocus(Index As Integer)
'輔助顯示相同數字
i = Index
If T1(i) <> "" Then
For x = 1 To 81
 If T1(i).Text = T1(x).Text And T1(x).Text <> "" Then
   T1(x).BackColor = vbYellow
 Else
   T1(x).BackColor = vbWhite
 End If
Next

Else
'這格是空的,顯示可能的數字
All = "123456789"
 a = (i - 1) \ 9 + 1
 b = (i - 1) Mod 9 + 1

 For x = 1 + (a - 1) * 9 To a * 9
  'T1(i).BackColor = vbRed
  If i <> x Then
   All = Replace(All, T1(x), "")
  End If
 Next x

 For x = b To 81 Step 9
   If i <> x Then
    All = Replace(All, T1(x), "")
   End If
 Next x
 '九個小區的檢查是否重複(n,m)=(1,1)~(3,3) 共九區
'(1,1),(1,2),(1,3)
'(2,1),(2,2),(2,3)
'(3,1),(3,2),(3,3)
n = (a - 1) \ 3 + 1
m = (b - 1) \ 3 + 1

'Print "("; n; ","; m; ")"
For z = 1 + (n - 1) * 27 To 19 + (n - 1) * 27 Step 9
 For x = z + (m - 1) * 3 To z + 2 + (m - 1) * 3
  If i <> x Then
   All = Replace(All, T1(x), "")
  End If
 Next x
Next z
 MsgBox All
End If
End Sub