1. Trang chủ
  2. » Công Nghệ Thông Tin

Các bài toán ma trận trong kĩ thuật lập trình

11 767 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 11
Dung lượng 33,29 KB

Nội dung

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 1

CÁ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 3

i,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 4

if(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 7

int 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 8

coủ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 10

retủ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;

}

Ngày đăng: 09/09/2015, 17:01

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w