標籤:style blog io ar color os sp for on
Game 24點遊戲演算法
問題:給出4個1-10的數字,通過加減乘除,得到數字為24就算勝利
輸入:4個1-10的數字。[數字允許重複,測試案例保證無異常數字]
輸出:True or False
#include <iostream>#include <stdlib.h>#include <string.h>#include <stdio.h>using namespace std;void cal(double re[6], double a, double b) {re[0] = a + b;re[1] = a - b;re[2] = b - a;re[3] = a * b;re[4] = a * 1.0 / b;re[5] = b * 1.0 / a;}bool is24Points(double a, double b) {double re[6];cal(re, a, b);int i;for (i = 0; i < 6; ++i) {if (re[i] == 24) {return true;}}return false;}void calThree(double re[108], double a, double b, double c) {int i, j, k;k = 0;double fi[6];double tt[6];cal(fi, a, b);for (i = 0; i < 6; ++i) {cal(tt, fi[i], c);for (j = 0; j < 6; ++j) {re[k++] = tt[j];}}cal(fi, a, c);for (i = 0; i < 6; ++i) {cal(tt, fi[i], b);for (j = 0; j < 6; ++j) {re[k++] = tt[j];}}cal(fi, b, c);for (i = 0; i < 6; ++i) {cal(tt, fi[i], a);for (j = 0; j < 6; ++j) {re[k++] = tt[j];}}}bool Game24Points(int a, int b, int c, int d) {double re[108];int i;calThree(re, b, c, d);for (i = 0; i < 108; i++) {if (is24Points(re[i], a))return true;}calThree(re, a, c, d);for (i = 0; i < 108; i++) {if (is24Points(re[i], b))return true;}calThree(re, a, b, d);for (i = 0; i < 108; i++) {if (is24Points(re[i], c))return true;}calThree(re, a, b, c);for (i = 0; i < 108; i++) {if (is24Points(re[i], d))return true;}return false;}int main() {cout << Game24Points(1, 2, 3, 4) << endl;cout << Game24Points(7, 2, 1, 10) << endl;cout << Game24Points(7, 7, 7, 7) << endl;return 0;}
周期串問題
問題:如果一個字串可以由某個長度為k的字串重複多次得到,我們說該串以k為周期。例如,abcabcabcabc以3為周期(注意,它也可以6和12為周期,結果取最小周期3)。字串的長度小於等於100,由調用者保證。
介面: int GetMinPeriod(char *inputstring)
輸入: char * inputstring 字串
返回: int 字串最小周期
int GetMinPeriod(char *inputstring) {/*在這裡實現功能*/int i, j;int len = strlen(inputstring);int result = len;for (i = 1; i < len / 2 + 1; i++) {for (j = 0; j < len - i; j++) {if (inputstring[j] != inputstring[j + i])break;}if (j == len - i) {result = i;break;}}return result;}
重複資料刪除字元
問題:給定一個字串,將字串中所有和前面重複多餘的字元刪除,其餘字元保留,輸出處理後的字串。需要保證字元出現的先後順序,並且區分大小寫。
介面:int GetResult(const char *input, char *output)
輸入:input
輸入字串 輸出:output
輸出字串
返回:0 成功 -1 失敗及異常
#include <map>#include <iostream>using namespace std;int GetResult(const char *input, char *output) {if (input == NULL || output == NULL)return -1;map<char, int> m;const char *p = input;while (*p) {m.insert(map<char, int>::value_type(*p, 0));p++;}p = input;char *p2 = output;while (*p) {m[*p]++;if (m[*p] == 1) {*p2++ = *p;}p++;}*p2 = '\0';return 0;}int main() {char *p = "aabbcdae";char *ou = (char *) malloc(1000);GetResult(p, ou);cout << ou << endl;}
N皇后
問題:皇后是國際象棋中威力最大的棋子。在下面所示的棋盤上,皇后可以攻擊位於箭頭所覆蓋位置的所有棋子。我們能不能把N個皇后放在棋盤(N×N)上,它們中的任何一個都無法攻擊其餘的皇后?請編寫程式找出一共有幾種方法。
介面:intPlaceQueenMethodNum(int n);
輸入:int n
皇后的個數 返回:放置 n 皇后方案的個數
#include <stdio.h>#include <stdlib.h>#include <iostream>bool find(int row, int col, int *q) {int i = 1;while (i < row) {if (q[i] == col || abs(i - row) == abs(q[i] - col))return false;i++;}return true;}void place(int row, int n, int *q, int *re) {if (row > n) {(*re)++;return;}int col;for (col = 1; col <= n; col++) {if (find(row, col, q)) {q[row] = col;place(row + 1, n, q, re);}}}int PlaceQueenMethodNum(int n) {int re = 0;int q[20];place(1, n, q, &re);return re;}int main(){std::cout<<PlaceQueenMethodNum(8);}
可怕的階乘
問題:計算階乘n!是一件可怕的事情,因為當n並不是很大時,n!將是一個很大的值。例如13! = 6227020800,已經超過了我們常用的unsigned int類型的取值範圍。請設計一個程式,使其可以計算100以內的數的階乘,結果用字串的形式輸出
介面:void CalcNN(int n, char *pOut)
輸入:int n
需要輸入的階乘數
輸出:char *pOut
結算結果,記憶體由調用者負責管理
#include <iostream>using namespace std;void CalcNN(int n, char *pOut) {int a[5000];memset(a, 0, sizeof(a));a[0] = 1;int i, j, k, len = 0;for (i = 1; i <= n; ++i) {for (j = 0; j <= len; ++j)a[j] *= i;for (j = 0; j <= len; ++j) {if (a[j] < 10)continue;k = j;while (k <= len) {if (a[len] > 9)++len;a[k + 1] += a[k] / 10;a[k] %= 10;++k;}}}char *p = pOut;for (i = len; i >= 0; --i) {*p++ = '0' + a[i];}*p = '\0';return;}int main() {char *p = (char *) malloc(1000);CalcNN(13, p);cout << p;}
軟體開發訓練 OJ 練習