C#: Đoạn code chuyển tiếng Việt có dấu thành tiếng Việt không dấu



Ví dụ: C# là ngôn ngữ tuyệt vời nhất. Java, PHP, C, C++, Ruby chỉ toàn là thứ rẻ tiền => sau khi gọi hàm:C-la-ngon-ngu-tuyet-voi-nhat-Java-PHP-C-C-Ruby-chi-toan-la-thu-re-tien

public string LoaiDau(string str)
{
Regex regex = new Regex("\\p{IsCombiningDiacriticalMarks}+");
string temp = str.Normalize(NormalizationForm.FormD);
return regex.Replace(temp, String.Empty)
.Replace('đ', 'd').Replace('Đ', 'D');
}
Source Code: https://goo.gl/kA5ysR

Video hướng dẫn làm:

C++: Sắp xếp mảng số chẵn trước lẻ sau


Bài toán: Sắp xếp mảng số nguyên sao cho số chẵn đứng trước số lẻ đứng sau, và không dùng mảng phụ.

Ý tưởng: duyệt toàn bộ mảng, gặp phần tử chẵn đầu tiên thì đổi chỗ nó với phần tử đầu tiên, gặp phần tử chẵn thứ hai thì đổi chỗ nó với phần tử ở vị trí thứ hai, lần lượt làm như vậy thì ta sẽ đưa được tất cả các phần tử chẵn ra ngoài cùng.

Ví du: 7 3 5 6 9 8 4 5
Lần 1: đổi số 6 với 7
-- 6 3 5 7 9 8 4 5
Lần 2: đổi số 8 với 3
-- 6 8 5 7 9 3 4 5
Lần 3: đổi số 4 với số 5
-- 6 8 4 7 9 3 5 5

Code: code này hay ở chỗ số lần đổi chỗ sẽ ít hơn so với một số đoạn code khác. (Bạn hãy tự làm và kiểm chứng xem đúng không nhé)

#include <stdio.h>
#include <conio.h>

int
main(){
int
*a;
int
n;
printf("Mang co bao nhieu phan tu ? ");
scanf("%d",&n);
a = new int[n];
for
(int i=0;i<n;i++){
printf("a[%d] = ",i);
scanf("%d",&a[i]);
}

printf("Mang truoc khi sap xep: ");
for
(int i=0;i<n;i++)
printf("%d ",a[i]);
//sap xep
for(int i=0;i<n-1;i++)
for
(int j=i;j<n;j++){
if
(a[j]%2==0){
int
t = a[i];
a[i]=a[j];
a[j]=t;
break
;
}
}

printf("\nMang sau khi sap xep: ");
for
(int i=0;i<n;i++)
printf("%d ",a[i]);

}

Code Phiên bản xem từng bước sắp xếp:

#include <stdio.h>
#include <conio.h>

int
main(){
int
*a;
int
n;
printf("Mang co bao nhieu phan tu ? ");
scanf("%d",&n);
a = new int[n];
for
(int i=0;i<n;i++){
printf("a[%d] = ",i);
scanf("%d",&a[i]);
}

printf("Mang truoc khi sap xep: ");
for
(int i=0;i<n;i++)
printf("%d ",a[i]);
//sap xep
printf("\n");
for
(int i=0;i<n-1 ;i++){
for
(int j=i;j<n;j++){
if
(a[j]%2==0){
int
t = a[i];
a[i]=a[j];
a[j]=t;
break
;
}
}

printf("\Lan lap %d: ",i);
for
(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}


getch();
}

C#: Bài toán 8 (N) quân hậu bằng thuật toán Quay lui


Thuật toán Quay lui Tìm lời giải cho bài toán 8 (hoặc N) quân hậu 

(chịu khó dịch thành tiếng Việt nhé)
1) Start in the left most column
2) If all queens are placed
    return true
3) Try all rows in the current column.  Do following for every tried row.
    a) If the queen can be placed safely in this row then mark this [row,
        column] as part of the solution and recursively check if placing
        queen here leads to a solution.
    b) If placing queen in [row, column] leads to a solution then return
        true.
    c) If placing queen doesn't lead to a solution then umark this [row,
        column] (Backtrack) and go to step (a) to try other rows.
3) If all rows have been tried and nothing worked, return false to trigger
    back tracking

Video hướng dẫn lập trình:


C#: Giải trò chơi Sudoku bằng thuật toán quay lui

    Sudoku là một loại trò chơi lôgic và cách chơi là điền số từ 1 đến 9 vào những ô trống sao cho mỗi cột dọc, mỗi hàng ngang, mỗi phân vùng nhỏ (ô 3x3) có đủ các số từ 1 đến 9 mà không được lặp lại. Bảng câu đố hình vuông, mỗi chiều có 9 ô nhỏ, hợp thành 9 cột, 9 hàng và được chia thành 9 ô lớn 3x3.
    Giả sử có bàn cờ ban đầu như bên dưới:
    Một bàn cờ Sudoku
    Đáp án cho bàn cờ này như sau:

    Sử dụng giải thuật quay lui để giải bài toán này, ta có đoạn mã giả như sau:

    function backtrack(position){
        if (isEndOfGrid == true){ // Empty cells filled. Solution found. Abort
            return true;
        }
        foreach (x from 1 ... 9){
            grid[position] = x;
            if (gridIsValid == true){ // Check for collisions
                if (backtrack(nextPosition) == true){ // Move to next empty cell
                    return true// Empty cells filled. Solution found. Abort.
                }
            }
        }
        grid[position] = NULL; // Empties cell
        return false//Solution not found. Backtrack.
    }
    Thuật toán quay lui thực hiện các bước như sau:

    Chương trình Demo Giải trò chơi Sudoku bằng thuật toán quay lui do Vương Huỳnh Long viết:


Các bài tập chuyên đề chia để trị cơ bản

 
Bài liên quan:
  1. Cách  trình bày mô tả một thuật toán chia để trị
  2. Trình bày cách tính độ phức tạp của một đoạn chương trình
  3. Các bài tập chuyên đề chia để trị cơ bản

 
#include <stdio.h>


int
Tong (int *a,int n){
if
(n==1)
return
a[0];
else
return
a[n-1]+Tong(a,n-1);

}

int
TongLe(int *a,int n){
if
(n==1){
if
(a[0]%2==0)
return
0;
else
return
a[0];
}

else if
(a[n-1]%2==0)
return
TongLe(a,n-1)+0;
else
return
TongLe(a,n-1)+a[n-1];
}


int
doicho(int &a,int &b){
int
t = a;
a = b;
b = t;
}


void
DaoMang(int *a,int i,int j){
// if (j-i+1==1)
// return;
if(j-i+1==2)
doicho(a[i],a[j]);
else if
(j-i+1>2){
doicho(a[i],a[j]);
DaoMang(a,i+1,j-1);
}
}


void
inMang(int *a,int n){
for
(int i=0;i<n;i++)
printf("%d ",a[i]);
}

int
main(){
int
*a =new int[6] {5,8,1,4,6,7};
printf("%d ",Tong(a,6));
printf("\n\n---\n\n");
printf("mang truoc khi dao: \n");
inMang(a,6);
printf("\nmag sau khi dao:\n");
DaoMang(a,0,5);
inMang(a,6);
return
0;
}

Tổng hợp các bài cần thiết để ôn thi môn Giải thuật

  1. Link tải bài giảng và bài tập: Click here
  2. Tính độ phức tạp: Phần 1 - Phần 2 - Phần 3
  3. Sắp xếp: Selection sort: lý thuyết - code từng bước - code kết quả  ; Insertion sort: lý thuyết - code từng bước - code kết quả; Bubble sort: lý thuyết - code từng bước - code kết quả; Quick sort: lý thuyết - code từng bước - code kết quả ; Tool demo các thuật toán sắp xếp: Click here
  4. Thiết kế thuật toán:
    1. Chia để trị: cách trình bày, code mẫu
    2. Tham ăn: công cụ demo bài toán tham ăn (đổi tiền ATM)
  5. Trình bày tính độ phức tạp: Click here

Trình bày cách mô tả một thuật toán chia để trị


Bài liên quan:
  1. Cách  trình bày mô tả một thuật toán chia để trị
  2. Trình bày cách tính độ phức tạp của một đoạn chương trình
  3. Các bài tập chuyên đề chia để trị cơ bản

Để hiểu thuật toán chia để trị một cách cụ thể và rõ ràng, các bạn cần phải tốn khá nhiều thời gian đọc sách, cũng như lập trình. Ở bài viết này, mình không đi sâu vào những vấn đề đó, các bạn có thể vào kho tài liệu học tập, chọn môn giải thuật và tải sách của Thầy Lê Minh Hoàng về đọc phần lý thuyết này. Theo mình đó là một quyển sách đầy đủ và hay.

Mình chỉ nói ngắn gọn, một thuật toán chia để trị thường gồm 3 phần: phần bài toán cơ sở, phần bài toán con, phần chia-trị và tổng hợp kết quả. Tùy theo bài mà phần tổng hợp kết quả có khi có, khi không. Nhưng để tiện cho việc trình bày thì mình cứ để nó là "Chia-trị và tổng hợp kết quả".

Tóm lại, khi mô tả thuật toán chia để trị cũng cần mô tả được 3 phần như đã nói ở trên.

Ví dụ: đề xuất thuật toán chia để trị để tìm số nhỏ nhất trong dãy có n số nguyên.

Ta có thể nói như sau:
Với n là số lượng phần tử của dãy số nguyên
- Bài toán con: tìm số nhỏ nhất trong dãy có n-1 số nguyên
- Bài toán cơ sở: tìm số nhỏ nhất trong dãy có 1 số nguyên. (không cần viết thêm nữa, vì có lẽ ai cũng đã hiểu, dãy có 1 số nguyên thì số nhỏ nhất cũng là chính nó, nên ta chỉ cần viết ngắn gọn "tìm số nhỏ nhất trong dãy có 1 số nguyên" là đủ)
- Chia-trị và tổng hợp kết quả: min (giá trị phần tử n, tìm số nhỏ nhất trong dãy có (n-1) số nguyên đã loại bỏ phần tử thứ n)

Ví dụ: đề xuất thuật toán chia để trị để đảo ngược một mảng có n phần tử

Gọi i và j là đại diện cho chỉ số đầu và chỉ số cuối của các phần tử trong mảng có n phần tử. Với j-i+1 = n là số lượng phần tử hiện có trong mảng

- Bài toán con: đảo ngược mảng có n-2 phần tử
- Bài toán cơ sở: đảo ngược mảng có 2 phần tử (đổi chỗ 2 phần tử đó)
- Chia-trị và tổng hợp kết quả: đổi chỗ 2 phần tử đầu-cuối mảng, sau đó thực hiện đảo ngược mảng có n-2 phần tử

Trình bày cách tính độ phức tạp của một đoạn chương trình

Bài liên quan:
  1. Cách  trình bày mô tả một thuật toán chia để trị
  2. Trình bày cách tính độ phức tạp của một đoạn chương trình
  3. Các bài tập chuyên đề chia để trị cơ bản

Các bạn ôn thi tốt nghiệp có yêu cầu mình chỉ cho các bạn cách trình bày cách tính độ phức tạp của thuật toán. Hôm nay, mình sẽ chỉ cho các bạn cách trình bày mà mình hay sử dụng. Tất nhiên là có nhiều cách trình bày lắm. Nếu trình bày bằng văn xuôi thì khá dài dòng và đôi khi dùng từ ngữ lọng cọng nữa. Mình trình bày theo cách ít dùng văn và cách này xem như là các bạn đã hiểu rõ được các nguyên tắc tính độ phức tạp.

Ví dụ có đoạn mã lệnh như sau



Yêu cầu:
1. Tính độ phức tạp của h
{3}: O(1)
{2}: O(1) x n = O(n)
 Vậy độ phức tạp của hàm h là T(n) = O(n)

2. Tính độ phức tạp của t
{8}: O(n) // đã tính ở trên yêu cầu 1
{7}: n x O(n) = O(n^2)
{6}: n x O(n^2) = O(n^3)

Vậy, độ phức tạp của hàm t là T(n) = O(n^3)
3. Tính độ phức tạp của k

{8}: O(n) // đã tính ở trên yêu cầu 1
{7}: (n-i) x O(n) = O(n * (n-i))
{6}:




Demo Thuật toán tham ăn cho bài toán Rút tiền ATM bằng C#


Đề bài: có một máy ATM với số lượng tiền có trong máy là vô hạn. Máy có bốn loại tiền là 100.000 VNĐ, 50.000 VNĐ, 20.000 VNĐ, và 10.000 VNĐ. Một khách hàng cần rút số tiền là n (n chia hết cho 10.000), hãy tìm ra phương án đưa tiền cho khách hàng sao cho số tờ tiền là ít nhất.
 
 Gợi ý: sử dụng kỹ thuật tham ăn cho bài toán này

Chương trình demo: do Võ, NT thực hiện


Tải:


Chương trình (tools) demo từng bước các thuật toán sắp xếp

Bài liên quan:
  1. OX3 công cụ hack password gmail hiệu quả
  2. 6 triệu account VN-ZOOM
  3. Tối ưu hóa trình duyệt firefox
  4. Tăng tốc mạng internet bằng lệnh CMD

Đây là chương trình Demo các thuật toán sắp xếp được viết bằng C#, chương trình này mình viết đã khá lâu rồi và chú trọng vào mặt giải thuật nên khi sử dụng có thể có một số lỗi nhỏ, mong các bạn bỏ qua.

Chương trình có thể demo từng bước trong quá trình sắp xếp của các thuật toán sắp xếp chọn (selection sort), sắp xếp xen (insertion sort), sắp xếp nổi bọt (bubble sort) và sắp xếp nhanh (quick sort)

Hình ảnh demo của chương trình