今天做了一道題,矩陣上的二分查找,居然做錯了。是考慮簡單了。一維上的算法擴展到二維的時候,需要仔細分析矩陣中的數據的相互聯繫,然後調整算法。
前些時候,樹狀數組那篇博客。在擴展到二維後,求子矩陣的區間和,就沒有考慮清楚誰減去誰。這次二分查找擴展到二維後,也沒有考慮清楚比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;
}
}