搜索其实就等于查找
就是枚举,一个个的对比,发现了就是发现了,没有就是没有了,但是效率低下。前面的枚举里面的百鸡百钱和棋盘问题都是这类解决方案。
#include
int search (int a[], int n, int k)
/*a查找表, n表长, k关键字*/
{ int i;
for (i=0; i
int bin_search (int a[ ], int n, int k)
{
int low, high, mid;
low=0; high=n-1;
while (low <= high)
{
mid=(low + high)/2;
if (k < a[mid])
high = mid - 1;
else if (k > a[mid])
low = mid + 1;
else
return mid ;
}
return -1;
}
int bin_search (int a[ ], int low,int high ,int k)
{
int mid=(low + high)/2;
if (low>high)
return -1;
else if (k == a[mid])
return mid;
else if (k > a[mid] )
bin_search(a,mid+1,high,k);
else
bin_search(a,low,mid-1,k);
}
#include
#include
int a[6][8]=
{
{0,0,0,0,0,0,0,0}, //6行8列,最外面一层是防止越界的,中心表示的是图像
{0,1,1,0,0,0,1,0},
{0,1,0,0,1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,1,0,0,1,1,0},
{0,1,0,0,0,0,0,0},
};
int visit[6][8];//标记已经访问的数据的位置
void dfs(int i,int j)
{
if(a[i][j]==1&&visit[i][j]==0)//如果颜色为黑色并且没有被访问过。
{
visit[i][j]=1;//标记当前的位置为已经访问
/**对周围的位置进行递归*/
dfs(i-1,j-1);dfs(i,j-1);dfs(i+1,j-1);
dfs(i-1,j); dfs(i,j+1);
dfs(i-1,j+1);dfs(i,j+1);dfs(i+1,j+1);
}
return ;
}
int main()
{
int i,j,count=0;
memset(visit,0,sizeof(visit)/sizeof(int));
for(i=1;i<5;i++)
{
for(j=1;j<7;j++)
{
if(visit[i][j]==0&&a[i][j]==1)
{
dfs(i,j);
count++;
}
}
}
printf("%d",count);
}
2.也可以自己显示的利用栈进行操作,代码如下。
#include
#include
#define M 100
typedef struct
{
int sk[M];
int top;
}S;
S my_stack;
int a[6][8]=
{
{0,0,0,0,0,0,0,0}, //6行8列,最外面一层是防止越界的,中心表示的是图像
{0,1,1,0,0,0,1,0},
{0,1,0,0,1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,1,0,0,1,1,0},
{0,1,0,0,0,0,0,0},
};
int visit[6][8]={0};//表示没有被访问
void find(int i,int j)
{
if(visit[i][j]==0&&a[i][j]==1)
{
visit[i][j]=1;
my_stack.sk[++my_stack.top]=i*8+j;
}
}
int main()
{
int i,j,count=0;
int u,t_i,t_j;
my_stack.top=-1;//初始化栈
memset(visit,0,sizeof(visit)/sizeof(int));
for(i=1;i<5;i++)
{
for(j=1;j<7;j++)
{
if(visit[i][j]==0&&a[i][j]==1)
{
my_stack.sk[++my_stack.top]=i*8+j;//入栈
visit[i][j]=1;
while(my_stack.top!=-1)
{
u=my_stack.sk[my_stack.top--];
t_i=u/8;t_j=u%8;
find(t_i-1,t_j-1);//出栈寻找周围的元素,如果符合条件就把周围的元素入栈
find(t_i-1,t_j);
find(t_i-1,t_j+1);
find(t_i,t_j-1);
find(t_i,t_j+1);
find(t_i+1,t_j-1);
find(t_i+1,t_j);
find(t_i+1,t_j+1);
}
count++;
}
}
}
printf("%d",count);
}
#include
#include
#define M 1000
/**思想是如果迷宫出的位置的数是0,并且没有被访问过,就进入队列,否则不进入,在出队列的时候对该位置周围
的值进行判断是否满足进入队列的条件,结束条件是到达中点,或者队列为空。*/
int count=1;
int t_i,t_j,u,i=0;
typedef struct
{
int queue[M];
int rear;
int head;
}S_queue;
S_queue my_queue;
char a[6][8]=//0表示的是障碍,1表示的是道路,开始坐标是(1,1)终止坐标是(4,6)
{
{0,0,0,0,0,0,0,0},
{0,1,1,1,1,1,1,0},
{0,1,0,0,1,0,0,0},
{0,1,0,0,1,1,1,0},
{0,1,1,1,1,1,1,0},
{0,0,0,0,0,0,0,0},
};
int visit[6][8]={0};//表示没有被访问
int pos[M];//记录每次插入数据后rear的位置,根据这个判断是不是count要加1
void find(int i,int j)
{
if(a[i][j]==1&&visit[i][j]==0)
{
visit[i][j]=visit[t_i][t_j]+1;
my_queue.queue[my_queue.rear++]=i*8+j;
}
}
int main()
{
int start_i=1,j=1,start_j=1;//开始位置
int end_i=4,end_j=6;
int flag=0;
memset(visit,0,sizeof(visit)/sizeof(int));
my_queue.rear=0;
my_queue.head=0;
my_queue.queue[my_queue.rear++]=start_i*8+start_j;
visit[start_i][start_j]=count;
while(my_queue.head