#include<iostream>
using namespace std;
bool search(int (*a)[1000],int m,int n,int o)
{
int i=0;int j=n-1;
while(i<m&&j>=0)
{
if(a[i][j]==o) return 1;
else
{
if(a[i][j]<o) i++;
else j--;
}
}
return 0;
}
int main()
{
int m,n,o,a[1000][1000];
while(cin>>m>>n)
{
cin>>o;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
if(search(a,m,n,o)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
![](https://img-my.csdn.net/uploads/201304/21/1366553084_9225.jpg)
#include<stdio.h>
int m,n,o,a[1000][1000],f;
void search(int lx,int ly,int hx,int hy)
{
if(f==1) return;
int lowx,lowy,highx,highy;
if(a[lx][ly]==o&&a[hx][hy]==o) {f=1;return;}
highx=(lx+hx)/2;
highy=(ly+hy)/2;
if(a[lx][ly]<=o&&o<=a[highx][highy]) search(lx,ly,highx,highy);
lowy=(ly+hy)/2+1;
highx=(lx+hx)/2;
if(a[lx][lowy]<=o&&o<=a[highx][hy]) search(lx,lowy,highx,hy);
lowx=(lx+hx)/2+1;
highy=(ly+hy)/2;
if(a[lowx][ly]<=o&&o<=a[hx][highy]) search(lowx,ly,hx,highy);
lowx=(lx+hx)/2+1;
lowy=(ly+hy)/2+1;
if(a[lowx][lowy]<=o&&o<=a[hx][hy]) search(lowx,lowy,hx,hy);
}
int main()
{
int i,j;
while(scanf("%d %d",&m,&n)!=EOF)
{
f=0;
scanf("%d",&o);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
search(0,0,m-1,n-1);
if(f==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
分治 把一块二维数组分为四块