lOMoARcPSD|37922327
lOMoARcPSD|37922327
1.Ví d 2:
1.1. Đề bài: Lit kê (duyt) các xâu nh phân có dài n.
1.2. Sơ ồ thut toán:
- Sơ ồ hàm sinh nh phân:
- Sơ ồ hàm main:
lOMoARcPSD|37922327
1.3. Viết code:
- Hàm sinh nh phân:
lOMoARcPSD|37922327
#include <bits/stdc++.h>
using namespace std;
int
n,k,a[100];
bool ok;
void
ktao(){
for(int
i=1;i<=n;i++){
a[i]=0;
}
}
void
sinh(){
int i=n;
while(i>=1&&a[i]==1){
a[i]=0;
--i;
}
if(i==0) ok=false;
else
a[i]=1;
}
1.4. Kết qu:
- Trường hp n=4:
lOMoARcPSD|37922327
2.Bài tp 1:
2.1. Đề bài: Cho mt hình ch nht gồm nxm hình vuông ơn vị. Hãy
lit kê tt c các ường i t nh cui ca ô vuông cui cùng phía
bên trái ến nh u ca ô vuông trên cùng phía bên phi. Biết mi
c i ch ược phép dch chuyn sang bên phi hoc lên trên
theo các cnh của hình vuông ơn vị.
2.2. Sơ ồ thut toán:
lOMoARcPSD|37922327
2.3. Viết code:
- Hàm kim tra:
lOMoARcPSD|37922327
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
n, m;
int dx[2] = {0, -1}, dy[2] = {1, 0}; int
kq[105];
bool checkOut(int x, int y){ if
(x < 0 || y > m) return false;
return true;
}
- Hàm x lý:
lOMoARcPSD|37922327
void ql(int x, int y, int count){
if (x == 0 && y == m){
for
(int i = 0; i < count; i++){
if
(kq[i] == 1) cout << "L ";
else
cout << "P ";
}
cout << endl;
return;
}
for (int i = 0; i < 2; i++){
int newx = x + dx[i];
int newy
= y + dy[i];
if (checkOut(newx, newy)
== true){
kq[count] = i;
count++;
ql(newx, newy, count);
count--;
}
}
}
- Hàm main:
lOMoARcPSD|37922327
int main(){
cin >> n >> m;
ql(n, 0, 0);
return 0;
}
2.4. Kết qu:
- Trường hp n=4, m=4:
3. Bài tp 2:
3.1. Đề bài: Hãy lit kê tt c các xâu nh phân có dài n sao cho mi
xâu nh phân có duy nht mt dãy k bit 1 liên tiếp.
3.2. Sơ ồ thut toán:
- Sơ ồ hàm sinh nh phân:
lOMoARcPSD|37922327
- Sơ ồ hàm kim tra k bit 1:
lOMoARcPSD|37922327
- Sơ ồ hàm main:
lOMoARcPSD|37922327
lOMoARcPSD|37922327
m sinh nh phân:
#include <bits/stdc++.h>
lOMoARcPSD|37922327
- Hàm kim tra k bit 1 liên tiếp:
bool check(){
bool check1=false;
for(int i=1;i<n;i++){
int dem=0;
if(a[i]==1){
dem=1;
for(int j=i+1;j<=n;j++){
if(a[i]==a[j]) dem++;
if(a[i]!=a[j]||j==n){
i=j;
break;
}
}
}
if(dem==k) check1=true;
}
if(check1) return true; else
return false;
}
- Hàm main:
lOMoARcPSD|37922327
int main(){
cin >> n >> k;
ktao();
ok=true;
while(ok){
if(check()){
for(int i=1;i<=n;i++){
cout << a[i];
}
cout << endl;
}
sinh();
}
}
lOMoARcPSD|37922327
3.4. Kết qu:
- Trường hp n=5 và k=3:
- Trường hp n=6 và k=4:

Preview text:

lOMoARcPSD| 37922327 lOMoARcPSD| 37922327 1.Ví dụ 2:
1.1. Đề bài: Liệt kê (duyệt) các xâu nhị phân có ộ dài n. 1.2. Sơ ồ thuật toán:
- Sơ ồ hàm sinh nhị phân: - Sơ ồ hàm main: lOMoARcPSD| 37922327 1.3. Viết code: - Hàm sinh nhị phân: lOMoARcPSD| 37922327 #include using namespace std; int n,k,a[100]; bool ok; void ktao(){ for(int i=1;i<=n;i++){ a[i]=0; } } void sinh(){ int i=n;
while(i>=1&&a[i]==1){ a[i]=0; --i; } if(i==0) ok=false; else a[i]=1; } 1.4. Kết quả: - Trường hợp n=4: lOMoARcPSD| 37922327 2.Bài tập 1:
2.1. Đề bài: Cho một hình chữ nhật gồm nxm hình vuông ơn vị. Hãy
liệt kê tất cả các ường i từ ỉnh cuối của ô vuông cuối cùng phía
bên trái ến ỉnh ầu của ô vuông trên cùng phía bên phải. Biết mỗi
bước i chỉ ược phép dịch chuyển sang bên phải hoặc lên trên
theo các cạnh của hình vuông ơn vị. 2.2. Sơ ồ thuật toán: lOMoARcPSD| 37922327 2.3. Viết code: - Hàm kiểm tra: lOMoARcPSD| 37922327 #include using namespace std; #define ll long long int n, m;
int dx[2] = {0, -1}, dy[2] = {1, 0}; int kq[105]; bool checkOut(int x, int y){ if
(x < 0 || y > m) return false; return true; } - Hàm xử lý: lOMoARcPSD| 37922327
void ql(int x, int y, int count){
if (x == 0 && y == m){ for
(int i = 0; i < count; i++){ if
(kq[i] == 1) cout << "L "; else cout << "P "; } cout << endl; return; }
for (int i = 0; i < 2; i++){ int newx = x + dx[i]; int newy = y + dy[i]; if (checkOut(newx, newy) == true){ kq[count] = i; count++; ql(newx, newy, count); count--; } } } - Hàm main: lOMoARcPSD| 37922327 int main(){
cin >> n >> m; ql(n, 0, 0); return 0; } 2.4. Kết quả: - Trường hợp n=4, m=4: 3. Bài tập 2:
3.1. Đề bài: Hãy liệt kê tất cả các xâu nhị phân có ộ dài n sao cho mỗi
xâu nhị phân có duy nhất một dãy k bit 1 liên tiếp. 3.2. Sơ ồ thuật toán:
- Sơ ồ hàm sinh nhị phân: lOMoARcPSD| 37922327
- Sơ ồ hàm kiểm tra k bit 1: lOMoARcPSD| 37922327 - Sơ ồ hàm main: lOMoARcPSD| 37922327 lOMoARcPSD| 37922327 Hàm sinh nhị phân: #include lOMoARcPSD| 37922327
- Hàm kiểm tra k bit 1 liên tiếp: bool check(){ bool check1=false; for(int i=1;i int dem=0; if(a[i]==1){ dem=1; for(int j=i+1;j<=n;j++){ if(a[i]==a[j]) dem++; if(a[i]!=a[j]||j==n){ i=j; break; } } } if(dem==k) check1=true; } if(check1) return true; else return false; } - Hàm main: lOMoARcPSD| 37922327 int main(){ cin >> n >> k; ktao(); ok=true; while(ok){ if(check()){ for(int i=1;i<=n;i++){ cout << a[i]; } cout << endl; } sinh(); } } lOMoARcPSD| 37922327 3.4. Kết quả:
- Trường hợp n=5 và k=3:
- Trường hợp n=6 và k=4: