贴吧题目 解法

     下面是我在贴吧看到的一个题,我试着编了下,如果你有更好的解法,请回复我!!!

    题目意思大概这样:有一个6*6数组,下面给出数组,随机输入x,y,求和当前选取的坐标x,y相同值的数组元素有多少个(不是全局扫描,是当前选取点的上下左右相同的点值相同,并且相同的点的上下左右做同样计数)
数组如下:
#include<iostream>
using namespace std;
int main()
{
int a[6][6]={{1,1,1,0,0,0},
{0,0,0,0,0,1},
{1,0,1,1,1,0},
{0,1,1,1,1,0},
{1,0,0,1,0,1},
{0,0,1,1,0,0}};
return 0;
}
示例1:如果x=3,y=3,就是选取了a[3][3]这个点,和他相关相同值的点有a[3,4],a[3,5],a[4,1],a[4,2],a[4,3],a[4,4],a[5,3],a[6,2],a[6,3],加上自己,总共有10个点。
示例2:如果x=0,y=0,就是选择了a[0][0]这个点,和他相关相同值的点有a[0,1],a[0,2],a[0,3],a[0,4],a[1,1],加上自己,总共有6个点。
输入x,y,求出相同点数。

#include <iostream>
using namespace std;
void shuchu(int x,int y); //输出区域中的坐标
int  panduan(int x,int y); //判断坐标已经存在
void cunfang(int x,int y);//存放数据到fuzhu数组中
typedef struct  
{
	int hen;//hen为横坐标
	int zon;//zon为纵坐标
}f;//记录每个域的值

f fuzhu[36];//最多连续36个点

static int count=0;//记录坐标的个数(cout+1)

int shuju[6][6]=         //这个二维数组可自由变动,以下的数据是我随便打的
{
	{0,1,0,1,1,1},
	{0,0,0,0,1,0},
	{1,1,1,1,1,0},
	{1,0,1,0,1,0},
	{1,0,1,0,0,0},
	{0,0,0,0,1,1}
};

int main()
{   int x1,y1;//x为横坐标,y为纵坐标
    int i,j;
	cout<<"这个区域的数据:"<<endl<<endl;
	for(i=0;i<6;i++)
	{	
		for(j=0;j<6;j++)
		{   
			cout<<shuju[i][j]<<" ";
		}cout<<endl;
	}
cout<<endl<<"输入坐标x,y的值:";
cin>>x1>>y1;
fuzhu[0].hen=x1;fuzhu[0].zon=y1;
shuchu(x1,y1);
cout<<"四周连续相同点数是: "<<count<<endl;
for(i=0;i<=count;i++)
{
	cout<<"("<<fuzhu[i].hen<<","<<fuzhu[i].zon<<")";
	if(i%4==0)cout<<endl;
}
cout<<endl;
system("pause");
return 0;
}


int panduan(int a,int b)   //等于1时,fuzhu数组中不存在这个坐标
{    int i;
	for (i=0;i<count;i++)
	{
		if (fuzhu[i].hen==a&&fuzhu[i].zon==b)
		{
			return 0;
		}
	}
return 1;
}

void cunfang(int a,int b)
{
	fuzhu[count].hen=a;
	fuzhu[count].zon=b;
}

void shuchu(int x,int y)
{
	if((shuju[x][y+1]==shuju[x][y])&&(-1<y+1)&&(y+1<6)) //判断这个坐标上方的值是否等于这个坐标值并且防止这个坐标超出范围
	{
		if(panduan(x,y+1)==1)
		{
			count++;
			cunfang(x,y+1);	
			shuchu(x,y+1);
			
		}
	}

if((shuju[x-1][y]==shuju[x][y])&&(-1<x-1)&&(x-1<6))
{
	if(panduan(x-1,y)==1)
	{
		count++;
		cunfang(x-1,y);	
		shuchu(x-1,y);
		
	}
}

if((shuju[x+1][y]==shuju[x][y])&&(-1<x+1)&&(x+1<6))
{      
	if(panduan(x+1,y)==1)
	{
	count++;
	cunfang(x+1,y);	
    shuchu(x+1,y);
	}
}

if((shuju[x][y-1]==shuju[x][y])&&(-1<y-1)&&(y-1<6))
{
	if(panduan(x,y-1)==1)
	{
		count++;
		cunfang(x,y-1);	
		shuchu(x,y-1);
	
	}
}
}

下面为运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值