回复 20楼 jack10141
我现在做的这个代码,你看看如何做search?

欢迎来到我的博客:http://blog..cn/noisunyuhong
程序代码:#include <stdio.h>
#include <stdlib.h>
#define MAXL 20//定义了block二维数组的最大值为20*20的矩阵
int blackcount=0,blackcounterd[MAXL][MAXL]={0};//blackcount为记录有几个连通块,blackcounter为标记
void text_data(int x[MAXL],int y[MAXL],int pieces[MAXL],int m)// 校验
{
int i;
for(i=0;i<n;i++)
{
if(x[i]<1||x[i]>n)
{
printf("Your input data is error!");
getchar();
exit(0);
}
if(y[i]<1||y[i]>n)
{
printf("Your input data is error!");
getchar();
exit(0);
}
if(pieces[i]!=0&&pieces[i]!=1)
{
printf("Your input data is error");
getchar();
exit(0);
}
}
}
void search_pieces(int x[MAXL],int y[MAXL],int block[MAXL][MAXL],int pieces[MAXL],int m,int n)//查找连通块
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
}
void put_pieces(int x[MAXL],int y[MAXL],int block[MAXL][MAXL],int pieces[MAXL],int m)//摆放棋子
{
int i;
for(i=0;i<m;i++)
block[x[i]][y[i]]=pieces[i];//将棋子的值赋给棋盘
}
void main()
{
int x[MAXL],y[MAXL],block[MAXL][MAXL],pieces[MAXL],i,j,n,m;//block为棋盘,i,j为循环用,x,y为坐标。
scanf("%d %d",&n,&m);//n为用户定义数组的大小,m为共放了几个棋子
for(i=0;i<n;i++)
for(j=0;j<n;j++)
block[i][j]=-1;//将棋盘全部赋给-1值,因为0是白棋,1是黑棋
for(i=0;i<n;i++)
scanf("%d %d %d %d",&pieces[i],&x[i],&y[i]);//输入棋子的颜色,坐标
text_data(x,y,pieces,m,n);//测试数据,将不正确的输入报错
put_pieces(x,y,block,pieces,m);//将坐标,棋盘,颜色,基本信息,传入摆放棋子函数中
search_pieces(x,y,block,pieces,m,n);//search_pieces为查找棋子有几个连通块
}

程序代码:#include <stdio.h>
#include <stdlib.h>
#define MAXL 20 //定义了block棋盘二维数组的最大值为20*20的矩阵
int n,m; //n为用户定义数组的大小,m为共放了几个棋子
int block[MAXL][MAXL]; //block为棋盘,
int color[MAXL][MAXL]={0}; //color为染色棋盘,颜色编号1~m,0表示无棋子,不染色
int Color=0; //Color 当前颜色
int numcolor=0; //即时的连通块数目,也就是当前棋盘颜色数
int num[MAXL*MAXL]; //存放每放一个棋子后的numcolor
int Changecolor(int newcolor, int oldcolor) //将old颜色全都换为new颜色
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(color[i][j] == oldcolor) color[i][j] = newcolor;
}
int connected(int x,int y,int a,int b) //连通相临两点
{
if(color[x][y]==0) //尚未染色的情况,与临块颜色相同
color[x][y]=color[a][b];
else if(color[x][y]!=color[a][b]) //已染色但是与临连块不同色
{
Changecolor(color[x][y],color[a][b]); //统一颜色
numcolor--; //颜色数量减少
}
}
int new_pieces(int x,int y,int b) //新增棋子后,重新染色
{
int u=0,d=0,l=0,r=0; //上下左右四个方向
if(block[x-1][y] != b && block[x+1][y] != b && block[x][y-1] != b && block[x][y+1] != b )
{ //如果该棋子为孤立的
Color++; //颜色数增加
color[x][y]=Color; //填色
numcolor++; //连通块数量也增加
return 0;
}
if(block[x-1][y] == b) //该棋子上连
connected( x, y,x-1,y);
if(block[x+1][y] == b) //该棋子下连
connected( x, y,x+1,y);
if(block[x][y-1] == b) //该棋子左连
connected( x, y,x,y-1);
if(block[x][y+1] == b) //该棋子右连
connected( x, y,x,y+1);
}
int main()
{
int i,j,b,x,y; //i,j为循环用,x,y为棋子坐标,b为颜色
scanf("%d%d",&n,&m); //n为用户定义数组的大小(边长),m为共放了几个棋子
for(i=0;i<=n+1;i++) //为处理方便,棋盘外围加一圈额外的-1
for(j=0;j<=n+1;j++)
block[i][j]=-1; //将棋盘全部赋给-1值,因为0是白棋,1是黑棋
for(i=0;i<m;i++)
{
scanf("%d%d%d",&b,&x,&y); //输入棋子的颜色b,坐标x,y
block[x][y]=b; //存入棋盘
new_pieces(x,y,b); //新增棋子后,染色作相应的改变
num[i]=numcolor; // 输出颜色数量到数组
}
for(i=0;i<m;i++)
{
printf("%d\n",num[i]); // 输出每一次的颜色数量即连通块数量
}
}

程序代码:#include <stdio.h>
#include <stdlib.h>
#define MAXL 20//定义了block二维数组的最大值为20*20的矩阵
int blackcount=0,blackcounterd[MAXL][MAXL]={0},count_b=0,n=0;//blackcount为染色连通块,blackcounter为标记 ,count_b为记录连通块
void print()//打印结果
{
printf("%d",count_b);
}
void changecolor(int newcolor,int oldcolor)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(blackcounterd[i][j]==oldcolor)blackcounterd[i][j]=newcolor;
}
void text_data(int x[MAXL],int y[MAXL],int pieces[MAXL],int m,int n)// 校验
{
int i;
for(i=0;i<n;i++)
{
if(x[i]<1||x[i]>n)
{
printf("Your input data is error!");
getchar();
exit(0);
}
if(y[i]<1||y[i]>n)
{
printf("Your input data is error!");
getchar();
exit(0);
}
if(pieces[i]!=0&&pieces[i]!=1)
{
printf("Your input data is error");
getchar();
exit(0);
}
}
}
void connected(int temp_x,int temp_y,int a,int b)
{
if(blackcounterd[temp_x][temp_y]==0)// //尚未染色的情况,与临块颜色相同
blackcounterd[temp_x][temp_y]=blackcounterd[a][b];
else if(blackcounterd[temp_x][temp_y]!=blackcounterd[a][b])
{
changecolor(blackcounterd[temp_x][temp_y],blackcounterd[a][b]);
count_b--;
}
}
void search_pieces(int x[MAXL],int y[MAXL],int block[MAXL][MAXL],int pieces[MAXL],int m,int n)//查找连通块
{
int i,temp_x,temp_y;
for(i=0;i<n;i++)
{
if(block[x[i+1]][y[i]]!=pieces[i]&&block[x[i-1]][y[i]]!=pieces[i]&&block[x[i]][y[i-1]]!=pieces[i]&&block[x[i]][y[i+1]]!=pieces[i])
//如果这个棋子是孤立的就把色块加一
{
blackcount=blackcount+1;
blackcounterd[x[i]][y[i]]=blackcount;//染色
count_b++;
}
if(block[x[i-1]][y[i]]==pieces[i])//该棋子上连
{
temp_x=x[i];temp_y=y[i];//因为不能将数组存入整形变量所以用一个“替身”代替
connected(temp_x,temp_y,temp_x-1,temp_y);
}
if(block[x[i+1]][y[i]]==pieces[i])//下连
{
temp_x=x[i];temp_y=y[i];//因为不能将数组存入整形变量所以用一个“替身”代替
connected(temp_x,temp_y,temp_x+1,temp_y);
}
if(block[x[i]][y[i-1]]==pieces[i])//左连
{
temp_x=x[i];temp_y=y[i];//因为不能将数组存入整形变量所以用一个“替身”代替
connected(temp_x,temp_y,temp_x,temp_y-1);
}
if(block[x[i]][y[i+1]]==pieces[i])//右连
{
temp_x=x[i];temp_y=y[i];//因为不能将数组存入整形变量所以用一个“替身”代替
connected(temp_x,temp_y,temp_x,temp_y+1);
}
}
}
void put_pieces(int x[MAXL],int y[MAXL],int block[MAXL][MAXL],int pieces[MAXL],int m)//摆放棋子
{
int i;
for(i=0;i<m;i++)
block[x[i]][y[i]]=pieces[i];//将棋子的值赋给棋盘
}
void main()
{
int x[MAXL],y[MAXL],block[MAXL][MAXL],pieces[MAXL],i,j,m;//block为棋盘,i,j为循环用,x,y为坐标。
printf("please input n and m:\n");
scanf("%d %d",&n,&m);//n为用户定义数组的大小,m为共放了几个棋子
for(i=0;i<n;i++)
for(j=0;j<n;j++)
block[i][j]=-1;//将棋盘全部赋给-1值,因为0是白棋,1是黑棋
printf("棋盘初始化完毕!请输入数据:\n");
for(i=0;i<m;i++)
scanf("%d %d %d",&pieces[i],&x[i],&y[i]);//输入棋子的颜色,坐标
text_data(x,y,pieces,m,n);//测试数据,将不正确的输入报错
put_pieces(x,y,block,pieces,m);//将坐标,棋盘,颜色,基本信息,传入摆放棋子函数中
search_pieces(x,y,block,pieces,m,n);//search_pieces为查找棋子有几个连通块
print();//打印结果
}
