đếm số lương các giá trị hoàng hậu. Một
số được gọi là hoàng hậu khi nó lớn nhất trên hàng và cột và hai đường chép đi qua nó
Đếm số lương các giá trị hoàng hậu?
E viết 1 hàm kiểm tra số hoàng hậu
, hàm này sẽ duyệt tất cả các phần tử trên hàng, cột, 2 đường chéo, nếu có phần tử nào lớn hơn nó thì trả về false
không thì trả về true
.
Sau đó e duyệt mảng 2 chiều và đêm số hoàng hậu nhờ vào hàm trên.
/BÀi 346: đếm số lương các giá trị hoàng hậu. Một
số được gọi là hoàng hậu khi nó lớn nhất trên hàng và cột và hai đường chép đi qua nó
---- Bài 347: đếm số lượng các giá trị yên ngựa trên ma trận. một số được gọi là yên ngựa
khi có giá trị nhỏ nhất trên cột và lớn nhất trên hàng/
#include<stdio.h>
#include<conio.h>
#define MAX 100
void NhapMang(float a[][MAX], int hang, int cot)
{
for (int i = 0; i < hang; i++)
{
for (int j = 0; j < cot; j++)
{
printf("Nhap vap a[%d][%d]: ", i, j);
scanf_s("%f", &a[i][j]);
}
}
}
void XuatMang(float a[][MAX], int hang, int cot)
{
for (int i = 0; i < hang; i++)
{
for (int j = 0; j < cot; j++)
{
printf("%6.2f", a[i][j]);
}
printf("\n");
}
}
void TimHoangHau(int a[][MAX], int hang, int cot){
float Max = a[0][0],Min=a[0][0];
bool Check = true;
for (int i = 0; i < hang; i++){
for (int j = 1; j < cot; j++){
if (a[i][j] >Max )
{
Check = false;
}
else { Check = true; }
if (a[i][j] < Min){
Check = false;
}
else{ Check = true; }
if (a[i + 1][j + 1] > Max){
Check = false;
}
else { Check = true; }
if (i - 1 < 0){
Check = false;
}
else if (a[i - 1][j + 1] > Max)
{
Check = true;
}
}
}
}
/*void TimSoLonNhatTrongHang(float a[][MAX], int k, int cot){
float Max = a[k][0];
for (int j = 1; j < cot ; j++){
if (a[k][j] > Max){
Max = a[k][j];
}
}
printf("%.2f", Max);
}*/
int main(){
float a[MAX][MAX];
int hang, cot;
do
{
printf("\nNhap so hang: ");
scanf_s("%d", &hang);
if (hang<0 || hang>MAX)
{
printf("\nKhong dung xin kiem tra lai!\n");
}
} while (hang<0 || hang>MAX);
do
{
printf("\nNhap so cot: ");
scanf_s("%d", &cot);
if (cot<0 || cot>MAX)
{
printf("\nKhong dung xin kiem tra lai!\n");
}
} while (cot<0 || cot>MAX);
NhapMang(a, hang, cot);
XuatMang(a, hang, cot);
int k;
printf("Nhap vao hang k (%d--->%d)can tim: ",0,hang-1);
scanf_s("%d", &k);
_getch();
return 0;
}
Anh xem lại hộ em với chỉ biết làm như thế này thôi!
Mạng dạo này k ổn, a thi thoảng mới vào dc, a có viết sẵn 1 hàm kiểm tra hậu, e xem thử xem chạy ổn không, a làm bình thường, không tối ưu gì cả, dựa theo định nghĩa thôi, a k rõ có tính giá trị trùng nhau không, ví dụ có 2 hậu mang giá trị 21, a tính cả 2. e k hiểu chỗ nào cứ hỏi nhé (a viết C++)
bool checkQueen(int a[10][10], int vtdong, int vtcot, int dong, int cot)
{
int x = a[vtdong][vtcot];
//ktra dong
for (int i = 0; i < cot; i++)
{
if (a[vtdong][i] > x)
return false;
}
//ktra cot
for (int j = 0; j < dong; j++)
{
if (a[j][vtcot] > x)
return false;
}
//ktra duong cheo thu nhat
int vtdong1 = vtdong + 1;
int vtcot1 = vtcot + 1;
while (vtcot1 + 1 < cot && vtdong1 < vtdong)
{
if (a[vtcot1][vtdong1] >x)
return false;
vtcot1++;
vtdong1++;
}
vtdong1 = vtdong - 1;
vtcot1 = vtcot - 1;
while (vtcot1 - 1 >= 0 && vtdong1 >= 0)
{
if (a[vtcot1][vtdong1] >x)
return false;
vtcot1--;
vtdong1--;
}
// duong cheo thu 2
vtdong1 = vtdong + 1;
vtcot1 = vtcot - 1;
while (vtcot1 - 1 >= 0 && vtdong1 < dong)
{
if (a[vtcot1][vtdong1] >x)
return false;
vtdong1++;
vtcot1--;
}
vtdong1 = vtdong - 1;
vtcot1 = vtcot + 1;
while (vtdong1 - 1 >= 0 && vtcot1 < cot)
{
if (a[vtcot1][vtdong1] >x)
return false;
vtdong1--;
vtcot1++;
}
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[10][10];
a[0][0] = 1; a[0][1] = 2; a[0][2] = 24; a[0][3] = 3;
a[1][0] = 9; a[1][1] = 7; a[1][2] = 6; a[1][3] = 8;
a[2][0] = 3; a[2][1] = 5; a[2][2] = 20; a[2][3] = 14;
int dong = 3;
int cot = 4;
int count = 0;
for (int i = 0; i < dong; i++)
{
for (int j =0 ; j < cot; j++)
{
int x = a[i][j];
if (checkQueen(a, i, j, dong, cot))
{
count++;
}
}
}
printf_s("So luong hau : %d", count);
scanf_s("%d");
return 0;
}