CÁC BÀI TOÁN TRÊN MA TRẬNGồm có: Tạo ra ma trận xoắn ốc, Sudoku, Caro, Dò mìn ,Stack ,Queue ,Các thao tác cơ bản 1.
Trang 1CÁC BÀI TOÁN TRÊN MA TRẬN
(Gồm có: Tạo ra ma trận xoắn ốc, Sudoku, Caro, Dò mìn ,Stack ,Queue ,Các thao tác cơ bản)
1 Tạo ra ma trận xoắn ốc :
void xoanoc(int [][MAX], int )
{
int k=1; //giá trị dùng để điể!n vào ma trận
int left=0, //các biển trái pha i trển dưới
right=n-1, //dùng để làm chố0t chặn top=0,
bottom=n-1;
int i=0,j=-1; //tăng j trước rố!i mới điể!n giá trị
while (k<=n n){ //chưa điể!n đủ n*n số0 thì còn lặp
//B1: chạy dọc biển trển từ trái sang pha i while (j<right) a[i][++j] = k++;
top++;//điể!ủ chỉ nh lại biển trển //B2: chạy dọc biển pha i từ trển xủố0ng dưới while (i<bottom) a[++i][j] = k++;
right ; //điể!ủ chỉ nh lại biển pha i //B3: chạy dọc biển dưới từ pha i sang trái while (j>left) a[i][ j] = k++;
bottom ;
//B4: chạy dọc biển trái từ dưới lển trển while (i>top) a[ i][j] = k++;
left++;
}
}
2 Caro :
void main()
{
int a[MAX][MAX],n;
docData(a,n);
inMat(a,n);
if(!kiemTraHopLe(a,n))
coủt<<"Dủ lieủ vao khong hop le !!!"<<endl;
else
{
coủt<<"Dủ lieủ vao hop le !!!"<<endl;
int kt=KiemTraThangThủa(a,n);
if(kt!=-2)
coủt<<kt<<" thang !!!"<<endl;
else
coủt<<"Dang choi !!!"<<endl;
}
}
void docData(int a[MAX][MAX],int &n)
{
FILE *fin;
fopen_s(&fin,"INPUT.TXT","rt");
if(!fin)
{
coủt<<"No file !!!"<<endl;
Trang 2}
// nhap n
fscanf_s(fin,"%d",&n);
// nhapma tran
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
fscanf_s(fin,"%d",&a[i][j]);
fclose(fin);
}
// in ma tran
void inMat(int a[MAX][MAX],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
//coủt<<a[i][j]<<"\t";
printf("%2d ",a[i][j]);
coủt<<endl;
}
}
// kiem tra hop le
int kiemTraHopLe(int a[MAX][MAX],int n)
{
int demA=0,demB=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(a[i][j]==0 || a[i][j]==-1 || a[i][j]== 1) {
if(a[i][j]==0)//dem cho ben A
demA++;
if(a[i][j]==1)// dem cho ben B
demB++;
} else {
retủrn 0;
} }
if(demA==demB || demA-demB==1 || demB-demA==1)
retủrn 1;
retủrn 0;
}
//
//kiem tra thang thủa
int KiemTraThangThủa(int a[MAX][MAX],int n)
{
if(n<5)
retủrn -2;
else
{
//cac bien chủng
int hs,// he so cong của cac hang va cot
dem=0,// so lan bang nhaủ của cac nủoc
Trang 3i,j;// cac he so chay
//hang ngang
for(i=0;i<n;i++)//cac hang dang xet
{
for(hs=0;hs<=n-5;hs++)
{
for(j=hs;j<hs+4;j++)// xet 5 o hang ngang
if(a[i][j]!=-1 && a[i][j+1]!=-1)
if(a[i][j]==a[i][j+1])
dem++;
else//ko bang nhaủ
j=hs+5;
else// co phan tủ trong
j=hs+5;
} if(dem==4) {
coủt<<"Thang hang ngang !!!"<<endl;
retủrn a[i][hs];
} dem=0;
}
}
//hang doc
dem=0;
for(j=0;j<n;j++)
{
for(hs=0;hs<=n-5;hs++)
{
for(i=hs;i<hs+4;i++) {
if(a[i][j]!=-1 && a[i+1][j]!=-1)
if(a[i][j]==a[i+1][j])
dem++;
else//ko bang nhaủ
i=hs+5;
else//co phan tủ trong
i=hs+5;
} if(dem==4) {
coủt<<"Thang hang doc !!!"<<endl;
retủrn a[hs][j];
} dem=0;
}
}
//hang cheo
dem=0;
int demp=0;
for(i=0;i<=n-5;i++)// xet hang tủ 0 den =n-5
for(j=0;j<=n-5;j++)//xet cot tủ 0 den =n-5
{
for(int k=0;k<=3;k++)// he so cong 0 1 2 3
Trang 4if(a[i+k][j+k]!=-1 && a[i+k+1][j+k+1]!=-1) {
if(a[i+k][j+k]==a[i+k+1][j+k+1])//phan tủ lien tiep tren
dem++;
//hang cheo bang nhaủ
} if( a[i+k][j+4-k]!=-1 && a[i+k+1][j+4-k-1]!=-1) {
if( a[i+k][j+4-k]==a[i+k+1][j+4-k-1])
demp++;//phan tủ tren hang cheo ngủoc }
} if(dem==4) {
coủt<<"Thang hang cheo !!!"<<endl;
retủrn a[i][j];
} dem=0;
if(demp==4) {
coủt<<"Thang hang cheo !!!"<<endl;
retủrn a[i][j+4];
} demp=0;
} }
retủrn -2;
}
3 Dò mìn :
//ham random
int random(int n)
{
int a=rand();
retủrn a%n;
}
//
//ham dat min vao ma tran
void datMin(int a[MAX][MAX],int n,int somin)
{
int i,j;
//khoi tao toan mang bang 0
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=0;
// dat tủng qủa vao ma tran
while(somin>0)
{
i=random(n);
j=random(n);
if(a[i][j]==0)// chủa co min {
a[i][j]=-1;// dat min vao somin ; // cap nhat lai so min con lai }
Trang 5}
// tinh toan gia tri so min dat xủng qủanh
void tinhSoMin(int a[MAX][MAX],int n )
{
int i,j,k,l,dem;
//
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i][j]!=-1) {
dem=0;
for( k=i-1;k<=i+1;k++)
for( l=j-1;l<=j+1;l++)
if( k>=0 && k<n &&
l>=0 && l<n &&
(k!=i || l!=j) && a[k][l]==-1
) {
dem++;
} a[i][j]=dem;
} }
// 6.viet ham tim vi tri ma xủng qủanh co nhieủ min nhat
void ViTriNhieủMin(int a[MAX][MAX],int n)
{
int vti=0,vtj=0,
soMin,CoKhoiTao=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) {
if(a[i][j]!=-1) {
if(CoKhoiTao==0) {
soMin=a[i][j];
vti=i;
vtj=j;
CoKhoiTao=1;
} else {
if(a[i][j]>soMin) {
soMin=a[i][j];
vti=i;
vtj=j;
} }
} }
printf("Vi tri nhieủ min nhat la :[%d][%d]\n",vti,vtj); }
//
Trang 6// 7.tim vủng co kich thủoc k*k (0<k<n)co it min nhat
//k cho trủoc
void VủngItMin(int a[MAX][MAX],int n,int k)
{
int CoKhoiTao=0,//co khoi tao
min=-1,//cho it min vtmini=-1,vtminj=-1;//vi tri vủng KxK for(int i=0;i<n-k;i++)
for(int j=0;j<n-k;j++) {
int tam=DemMin(a,n,i,j,k);
if(CoKhoiTao==0) {
min=tam;
vtmini=i;
vtminj=j;
CoKhoiTao = 1;
} else {
if(tam<min) {
min=tam;
vtmini=i;
vtminj=j;
} }
} coủt<<"Vi tri vủng k*k it min:["<<vtmini<<"]["<<vtminj<<"]"<<endl; coủt << "So min it nhat do la :" << min << endl;
}
//
//dem min trong pham vi KxK
int DemMin(int a[MAX][MAX],int n,int k,int vti,int vtj)
{
int dem=0;
for(int i=vti;i<vti+k;i++)
for(int j=vtj;j<vtj+k;j++) {
if(a[i][j]==-1)
dem++;
} retủrn dem;
}
//
// 8.Ham cho biet vủng lon nhat chủa cac so 0 lien ke // co bao nhieủ o
void DemO(int a[MAX][MAX],int n)
{
int Max=-1,//so o trong it nhat của vủng dang xet
CoMin=0,// co danh daủ khoi tao Min Vủngi=-1,Vủngj=-1;//vi tri vủng it min nhat for(int i=0;i<n;i++)
for(int j=0;j<n;j++) {
if(a[i][j]==0) {
int tami=i,tamj=j;//lủủ lai vi tri hien tai a[i][j]=-9;
Trang 7int dem=1,
kiemtra;
//lủủ vao stack ST[top].i=i;
ST[top++].j=j;
//
DủyetO(a,n,i,j,kiemtra);
int isave=i,jsave=j;
//
while(top>0)//chủa het stack {
if(kiemtra==0)//het o dủyet {
i=ST[top-1].i;
j=ST[top-1].j;
top ;
} else//con o chủa dủyet {
a[i][j]=-9;
ST[top].i=isave;
ST[top].j=jsave;
top++;
dem++;
} //printfMat(a,n);
//int chay;
//cin>>chay;
isave=i;//lủủ vi tri i dang dủyet jsave=j;//lủủ vi tri j dang dủyet DủyetO(a,n,i,j,kiemtra);
} //khoi phủc lai i,j i=tami;
j=tamj;
if(CoMin==0)// chủa khoi tao max {
Max=dem;
Vủngi=i;
Vủngj=j;
CoMin=1;
} else {
if(dem>Max) {
Max=dem;
Vủngi=i;
Vủngj=j;
} }
} }
if(Max!=-1)
{
coủt<<"Vủng co nhieủ o so 0 nhat la vủng:[";
coủt<<Vủngi<<"]["<<Vủngj<<"]"<<endl;
coủt<<"So o vủng do la:"<<Max<<endl;
Trang 8coủt<<"khong co vủng co o so 0 !!!"<<endl;
}
//
//ham kiem tra xem xủng qủanh con o nao dủyet dc nủa hay ko
//dủyet tiep dc ->1
//ko dủyet teip dc->0
void DủyetO(int a[MAX][MAX],int n,int &vti,int &vtj,int &kiemtra)
{
for(int i=vti-1;i<=vti+1; i++)
for(int j=vtj-1;j<=vtj+1;j++) {
if(i>=0 && j>=0) {
if(a[i][j]==0) {
vti=i;
vtj=j;
//coủt<<"Trong ij="<<vti<<" "<<vtj<<endl; kiemtra=1;//con o de dủyet tiep
retủrn;
} }
} kiemtra=0;// het o de dủyet //khi ket thủc tra ra vi tri daủ tien
//ma co the dủyet den vao vti va vtj
}
4 Stack :
//Khai báo cấ0ủ trúc dữ liệủ ngăn xể0p (STACK)
//sư dụng ma ng 1 chiể!ủ để lưủ trữ nội dủng
#define MAX 100
typedef strủct {
int top;
int arr[MAX];
}STACK;
//Các thao tác trển ngăn xể0p
//1 Khở i tạo 1 ngăn xể0p rốmng
void init(STACK &s){
s.top = -1;
}
//2 Kiể m tra xem ngăn xể0p có rốmng hay khống
int isempty(STACK s){
retủrn (s.top==-1);
}
//3 Kiể m tra xem ngăn xể0p đã đấ!y hay chưa
int isfủll(STACK s){
retủrn (s.top==MAX-1);
}
//4 Cấ0t 1 giá trị x vào ngăn xể0p
void pủsh(STACK &s, int valủe){
if (!isfủll(s)){
s.top++;
s.arr[s.top] = valủe;
}
}
Trang 9//5 Lấ0y 1 giá trị ra kho i đỉ nh ngăn xể0p
int pop(STACK &s){
if (isempty(s)) retủrn 0;//giá trị đặc biệt
int t = s.arr[s.top];
s.top ;
retủrn t;
}
5 Các thao tác cơ bản :
//1 Tìm dòng có tố ng lớn nhấ0t củ a ma trận
//Tra vể! số0 thứ tự củ a dòng có tố ng đạt max
//Tham số0 t chứa giá trị tố ng củ a dòng đạt max
int maxdong(int [][MAX], int , int , int &t
{
int i,j,td=0,vt;
for(j=0; j<c; j++) td += a[0][j]; //tính tố ng dòng 0
for(i=1; i<d; i++){ //dủyệt từ dòng thứ 1 trở đi
for(j=0; j<c; j++) td += a[i][j]; //tính tố ng dòng i
if (t<td) { //dòng i có tố ng lớn hởn
vt = i; //và chỉ số0 dòng }
}
retủrn vt;
}
//2 Cộng 2 ma trận (cùng kích thước dxc)
void congmt(int [][MAX], int [][MAX], int [][MAX], int , int ) {
int i,j;
for(i=0; i<d; i++)
for(j=0; j<c; j++)
t[i][j] = a[i][j] + b[i][j];
}
//3 Nhấn 2 ma trận (mxn) và (nxp)
//Ma trận tích có kích thước mxp
void nhanmt(int [][MAX],int [][MAX],int [][MAX],int , int , int ) {
int i,j,k;
for(i=0; i<m; i++) //dủyệt qủa ma trận T
for(j=0; j<p; j++){
for(k=0; k<n; k++) //cộng dố!n các tích
t[i][j] += a[i][k]*b[k][j];
} }
//Một số0 thao tác trển ma trận vủống cấ0p nxn
//4 Kiể m tra ma trận đởn vị
int mtdonvi(int [][MAX], int )
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if ((i==j && a[i][j]!=1)||(i!=j && a[i][j]!=0))
Trang 10retủrn 0;
retủrn 1;
}
//5 Kiể m tra ma trận tam giác dưới
int mttamgiacdủoi(int [][MAX], int )
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if ((i>=j && a[i][j]==0)||(i<j && a[i][j]!=0))
retủrn 0;
retủrn 1;
}
//6 Kiể m tra ma trận tam giác trển
int mttamgiactren(int [][MAX], int )
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
if ((i<=j && a[i][j]==0)||(i>j && a[i][j]!=0))
retủrn 0;
retủrn 1;
}
//7 Kiể m tra ma trận đố0i xứng
int mtdoixủng(int [][MAX], int )
{
int i,j;
for(i=0; i<n; i++)
for(j=i+1; j<n; j++)
if (a[i][j]!=a[j][i])
retủrn 0;
retủrn 1;
}
//8 Tạo ma trận chủyể n vị
void mtchủyenvi(int [][MAX], int at[][MAX], int )
{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
at[j][i] = a[i][j];
}
6 Hình vuông Latin:
//kiem tra cot
int ktcot(int a[MAX][MAX], int k,int n)
{
for(int i=0; i<n; i++)
for(int j=i+1; j<n; j++) {
if (a[i][k] && a[i][k]==a[j][k])
retủrn 1;
if(a[i][j]>n || a[i][j]<1 )
retủrn 1;
} retủrn 0;
}
Trang 11//Kiể m tra dòng k có vi phạm hay khống
int ktdong(int a[][MAX], int k,int n)
{
for(int i=0; i<n; i++)
for(int j=i+1; j<n; j++) {
if (a[k][i] && a[k][i]==a[k][j])
retủrn 1;
if(a[i][j]>n || a[i][j]<1 )
retủrn 1;
} retủrn 0;
}
//kiể m tra vị trí i,j có vi phạm hay khống
int VitriViPham(int a[MAX][MAX],int n,int i,int j) {
int k;
k=ktdong(a,i,n);
if(k==1)
retủrn 1;
k=ktcot(a,j,n);
if(k==1)
retủrn 1;
retủrn 0;
}