tema:
Hay una matriz de números ( matriz 2D ),
Cada fila de la matriz aumenta de izquierda a derecha , y
la matriz aumenta de arriba a abajo .
Escriba un programa para encontrar si existe un cierto número en dicha matriz.Requisitos: La complejidad del tiempo es menor que O(N) .
=========================================================================
Ideas:
Idea general:
(1).
Función personalizada:
Darse cuenta de la lógica :
Debido a que es una matriz de Young , el número más a la derecha en una fila es el más grande ,
Si el valor máximo es menor que el valor que está buscando , puede excluir esta fila .
Lo mismo ocurre con las columnas .
Los parámetros de la función reciben el nombre de la matriz bidimensional , el número a buscar ,
El puntero (dirección) de la variable que almacena el número de filas de la matriz y el puntero (dirección) de la variable que almacena el número de columnas de la matriz .
Encuentre el valor máximo de la primera fila de una matriz bidimensional por dos variables ,
Usando el bucle while , si no se encuentra el número máximo de filas y el número de columnas de la matriz bidimensional ,
( El número más a la derecha de la fila es la columna más grande , juzgue gradualmente hasta la columna más pequeña )
entonces continúa buscando .
(2).
En el ciclo while :
Utilice la instrucción de juicio condicional if para juzgar si el valor máximo en la primera fila es menor que el valor que está buscando .
Si es menor que , entonces esta fila no puede tener el valor que se encuentra , puede excluir esta fila y mover el puntero a la siguiente fila ,
Si el valor máximo es mayor que el valor que se va a buscar, entonces el valor está en esta fila y el número de columnas se mueve gradualmente para buscar en una nueva fila .
Si el valor a encontrar es directamente igual al valor máximo de la fila o se encuentra ajustando el número de filas y columnas ,
Luego establezca el número de filas y columnas encontradas a través del puntero de la variable número de fila y número de columna de la matriz ,
Si no se encuentra después de salir del bucle , establezca la "coordenada" de k en (-1, -1) y no se encontrará la tabla .
(3).
función principal:
Dada una matriz de Young ( matriz 2D ),
Ingrese el número a encontrar en la matriz ,
Establecer las filas y columnas de la matriz .
Use una función personalizada para hacer la búsqueda ,
Los parámetros de la función son el nombre de la matriz bidimensional , el número que se buscará ,
El puntero (dirección) de la variable de número de fila de matriz y el puntero (dirección) de la variable de número de columna de matriz .
Imprime la situación correspondiente a través de la situación de búsqueda de la función .
primer paso:
Función personalizada:
Darse cuenta de la lógica :
Debido a que es una matriz de Young , el número más a la derecha en una fila es el más grande ,
Si el valor máximo es menor que el valor que está buscando , puede excluir esta fila .
Lo mismo ocurre con las columnas .
Los parámetros de la función reciben el nombre de la matriz bidimensional , el número a buscar ,
El puntero (dirección) de la variable que almacena el número de filas de la matriz y el puntero (dirección) de la variable que almacena el número de columnas de la matriz .
Encuentre el valor máximo de la primera fila de una matriz bidimensional por dos variables ,
Usando el bucle while , si no se encuentra el número máximo de filas y el número de columnas de la matriz bidimensional ,
( El número más a la derecha de la fila es la columna más grande , juzgue gradualmente hasta la columna más pequeña )
entonces continúa buscando .
Código de implementación:
#include <stdio.h> //自定义函数: void young_table_search(int arr[3][3], int k, int* px, int* py) { //通过两个变量找出二维数组第一行的最大值: //行和列是从0开始的, int x = 0; //二维数组的行,从第一行进行查找 int y = *py - 1; //二维数组的列,从最大列开始查找, //使用 while循环 进行查找: while (x<=*px-1 && y>=0) //x<=*px-1 -- 未查找到最大行数 //y>=0 -- 未调整到最小列数 { } } int main() { return 0; }
Darse cuenta de la imagen:
Segundo paso:
En el ciclo while:
Utilice la instrucción de juicio condicional if para juzgar si el valor máximo en la primera fila es menor que el valor que está buscando .
Si es menor que , entonces esta fila no puede tener el valor que se encuentra , puede excluir esta fila y mover el puntero a la siguiente fila ,
Si el valor máximo es mayor que el valor que se va a buscar, entonces el valor está en esta fila y el número de columnas se mueve gradualmente para buscar en una nueva fila .
Si el valor a encontrar es directamente igual al valor máximo de la fila o se encuentra ajustando el número de filas y columnas ,
Luego establezca el número de filas y columnas encontradas a través del puntero de la variable número de fila y número de columna de la matriz ,
Si no se encuentra después de salir del bucle , establezca la "coordenada" de k en (-1, -1) y no se encontrará la tabla .
Código de implementación:
#include <stdio.h> //自定义函数: void young_table_search(int arr[3][3], int k, int* px, int* py) { //通过两个变量找出二维数组第一行的最大值: //行和列是从0开始的, int x = 0; //二维数组的行,从第一行进行查找 int y = *py - 1; //二维数组的列,从最大列开始查找, //使用 while循环 进行查找: while (x<=*px-1 && y>=0) //x<=*px-1 -- 未查找到最大行数 //y>=0 -- 未调整到最小列数 { if (arr[x][y] < k) //第一行最大值 小于 k { x++; //排除这一行,移到下一行 } else if (arr[x][y] > k) //第一行最大值 大于 k { y--; //k就在这一行,移到列进行查找 } else //找到了:把k的行和列赋给指针px和py { *px = x; *py = y; return; } } //自定义未找到的情况: *px = -1; *py = -1; } int main() { return 0; }
Darse cuenta de la imagen:
tercer paso:
función principal:
Dada una matriz de Young ( matriz 2D ),
Ingrese el número a encontrar en la matriz ,
Establecer las filas y columnas de la matriz .
Use una función personalizada para hacer la búsqueda ,
Los parámetros de la función son el nombre de la matriz bidimensional , el número que se buscará ,
El puntero (dirección) de la variable de número de fila de matriz y el puntero (dirección) de la variable de número de columna de matriz .
Imprime la situación correspondiente a través de la situación de búsqueda de la función .
Código de implementación:
#include <stdio.h> //自定义函数: void young_table_search(int arr[3][3], int k, int* px, int* py) { //通过两个变量找出二维数组第一行的最大值: //行和列是从0开始的, int x = 0; //二维数组的行,从第一行进行查找 int y = *py - 1; //二维数组的列,从最大列开始查找, //使用 while循环 进行查找: while (x<=*px-1 && y>=0) //x<=*px-1 -- 未查找到最大行数 //y>=0 -- 未调整到最小列数 { if (arr[x][y] < k) //第一行最大值 小于 k { x++; //排除这一行,移到下一行 } else if (arr[x][y] > k) //第一行最大值 大于 k { y--; //k就在这一行,移到列进行查找 } else //找到了:把k的行和列赋给指针px和py { *px = x; *py = y; return; } } //自定义未找到的情况: *px = -1; *py = -1; } int main() { //给出一个杨氏矩阵: int arr[3][3] = { 1,2,3,4,5,6,7,8,9 }; // 1 2 3 // 4 5 6 // 7 8 9 //输入要找的数: int k = 0; scanf("%d", &k); //设置矩阵的行和列: int x = 3; //矩阵的行 int y = 3; //矩阵的列 //使用自定义函数进行查找: young_table_search(arr, k, &x ,&y); //根据情况大于相应情况: if (x==-1 && y==-1) //未找到 { printf("未找到"); } else //找到了 { printf("找到了,它的下标为:第%d行 第%d列", x, y); } return 0; }
Darse cuenta de la imagen:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Código final y efecto de implementación
Código definitivo:
#include <stdio.h> //自定义函数: void young_table_search(int arr[3][3], int k, int* px, int* py) { //通过两个变量找出二维数组第一行的最大值: //行和列是从0开始的, int x = 0; //二维数组的行,从第一行进行查找 int y = *py - 1; //二维数组的列,从最大列开始查找, //使用 while循环 进行查找: while (x<=*px-1 && y>=0) //x<=*px-1 -- 未查找到最大行数 //y>=0 -- 未调整到最小列数 { if (arr[x][y] < k) //第一行最大值 小于 k { x++; //排除这一行,移到下一行 } else if (arr[x][y] > k) //第一行最大值 大于 k { y--; //k就在这一行,移到列进行查找 } else //找到了:把k的行和列赋给指针px和py { *px = x; *py = y; return; } } //自定义未找到的情况: *px = -1; *py = -1; } int main() { //给出一个杨氏矩阵: int arr[3][3] = { 1,2,3,4,5,6,7,8,9 }; // 1 2 3 // 4 5 6 // 7 8 9 //输入要找的数: int k = 0; scanf("%d", &k); //设置矩阵的行和列: int x = 3; //矩阵的行 int y = 3; //矩阵的列 //使用自定义函数进行查找: young_table_search(arr, k, &x ,&y); //根据情况大于相应情况: if (x==-1 && y==-1) //未找到 { printf("未找到"); } else //找到了 { printf("找到了,它的下标为:第%d行 第%d列", x, y); } return 0; }
lograr efecto