矩陣上的二分查找

今天做了一道題,矩陣上的二分查找,居然做錯了。是考慮簡單了。一維上的算法擴展到二維的時候,需要仔細分析矩陣中的數據的相互聯繫,然後調整算法。


前些時候,樹狀數組那篇博客。在擴展到二維後,求子矩陣的區間和,就沒有考慮清楚誰減去誰。這次二分查找擴展到二維後,也沒有考慮清楚比arr[x][y]大的數據元素都可能在哪些區域。


下面是代碼,還可以優化,有些空間重複搜索了。

#include<iostream>
using namespace std;
int arr[110][110];
struct position{
	int x,y;
};
position * search(int sea,int m,int n,int p,int q){
	if(p>m || q>n){
		position * ans= new position();
		ans->x=-1;
		ans->y=-1;
		return ans;
	}
	int x,y;
	y=(p+m)/2;
	x=(q+n)/2;
	if(arr[y][x]==sea){
		position * ans= new position();
		ans->x=x;
		ans->y=y;
		return ans;
	}
	if(arr[y][x]>sea){      //比Sea小的區域,可能存在於兩部分
		position * ans=search(sea,y-1,n,p,q);
		if(ans->x >= 0)
			return  ans;
		return search(sea,m,x-1,p,q);   // search(sea,m,x-1,y,q)  就應該和 search(sea,y-1,n,p,q); 沒有重複的了
	}
	if(arr[y][x]<sea){     //比Sea大的區域,可能存在於兩部分
		position * ans=search(sea,m,n,p,x+1);
		if(ans->x >= 0)
			return  ans;
		return search(sea,m,n,y+1,q);  //search(sea,m,x,y+1,q);就應該和 search(sea,m,n,p,x+1); 沒有重複的了

	}
	
}

int main(){
	int i=0,j=0;
	int m=100,n=100;
	for(i=0;i<=m;i++){
		for(j=0;j<=n;j++){
			arr[i][j]=i*99+j;
		}
	}
	position * ans;
	int s;
	while(scanf("%d",&s)==1){
		ans=search(s,10,10,0,0);
		cout<<ans->y<<" "<<ans->x<<endl;
	}
	for(i=0;i<=10;i++){
		for(j=0;j<=10;j++){
			cout<<arr[i][j]<<" ";
		}
		cout<<endl;
	}
	

}




發佈了33 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章