`

南阳理工OJ 592 spiral grid 蛇形填数,素数迷宫,宽度搜索

 
阅读更多
#include<stdio.h>
#include<string.h>
bool sushu[10010];
int map[110][110];
bool ves[110][110];
int fang[4][2]={1,0,-1,0,0,1,0,-1};
struct node
{
	int x,y,step;
}a,b,queue[10000];
int base,top;
void f()
{
	int i=1,j=1,term=10000;
	memset(map,0,sizeof(map));
	while(term>1)
	{
		while(map[i][j+1]==0&&j<100)map[i][j++]=term--;
		while(map[i+1][j]==0&&i<100)map[i++][j]=term--;
		while(map[i][j-1]==0&&j>1)  map[i][j--]=term--;
		while(map[i-1][j]==0&&i>1)  map[i--][j]=term--;
	}
	map[i][j]=1;
	return;
}
void g()
{
	memset(sushu,1,sizeof(sushu));
	sushu[1]=0;
	for(int i=2;i<=100;i++)
		if(sushu[i])
			for(int j=i*i;j<=10000;j+=i)
				sushu[j]=0;
}
bool _is(int x,int y)
{
	if(map[x][y]!=0&&(!sushu[map[x][y]])&&(!ves[x][y]))return true;
	return false;
}
int main()
{
	f();
	g();
	bool flag;
	int i,j,num=1,x,y;
	while(~scanf("%d%d",&x,&y))//测试数据有问题,x是素数时,也要求出结果,y是素数时,不应该求出结果
	{
		memset(ves,0,sizeof(ves));
		printf("Case %d: ",num++);
	/*	if(sushu[y]||sushu[x])  //一加这句话就错,真坑
		{
			printf("impossible\n");
			continue;
		}*/
		if(x==y)
		{
			printf("0\n");
			continue;
		}
		for(i=1,flag=false;i<=100;i++)
		{
			for(j=1;j<=100;j++)
				if(map[i][j]==x)
				{
					a.x=i;
					a.y=j;
					a.step=0;
					flag=1;
					break;
				}
			if(flag)break;
		}
		base=top=0;
		queue[top++]=a;
		ves[a.x][a.y]=true;
		flag=0;
		while(base!=top)
		{
			a=queue[base++];
			for(i=0;i<4;i++)
			{
				b.x=a.x+fang[i][0];
				b.y=a.y+fang[i][1];
				if(_is(b.x,b.y))
				{
					ves[b.x][b.y]=true;
					b.step=a.step+1;
					if(map[b.x][b.y]==y)
					{
						flag=true;
						break;
					}
					queue[top++]=b;
				}
			}
			if(flag)break;
		}
		if(flag)printf("%d\n",b.step);
		else printf("impossible\n");
	}
	return(0);
}

 

 

/*
第二种方法,优化了时间
*/
#include<stdio.h>
#include<math.h>
#include<string.h>
int shang,xia,zuo,you,queue[10010],mm[10010],base,top,result,num,fushu,zhengshu;
bool sushu[10010];
void f(int n)//求n的上下左右四个数
{
	if(n<0)n=-n;
	if(n==1){shang=4;xia=8;zuo=6;you=2;return;}
	if(n==4){shang=15;xia=1;zuo=5;you=3;return;}
	int m=(int)sqrt((double)n),jvli=n-m*m;
	if(jvli==0){shang=n-4*m+5;xia=n+4*m+3;zuo=n-1;you=n+1;}
	else if(jvli==1){shang=n+1;xia=n+4*m+3;zuo=n-1;you=n+4*m+5;}
	else if(jvli>1&&jvli<=m){shang=n+1;xia=n-1;zuo=n-4*m+3;you=n+4*m+5;}
	else if(jvli==m+1){shang=n+4*m+7;xia=n-1;zuo=n+1;you=n+4*m+5;}
	else {shang=n+4*m+7;xia=n-4*m+1;zuo=n+1;you=n-1;}
	if(m%2==0)
	{
		shang^=xia^=shang^=xia;
		zuo^=you^=zuo^=you;
	}
}
void g()//求素数
{
	memset(sushu,1,sizeof(sushu));
	sushu[1]=0;
	for(int i=2;i<=100;i++)
		if(sushu[i])
			for(int j=i*i;j<10010;j+=i)
				sushu[j]=0;
}
bool r(int x)//入队,判断,求结果
{            //我用给的两点同时入队遍历,为了区分,一个入队正数,一个入队负数
	if(x>10000)return(false);
	if(sushu[x])return(false);
	if(mm[x]==0)//如果没有标记
	{
		if(queue[base]<0)
		{
			mm[x]=mm[-queue[base]]-1;//标记,记步数
			queue[top++]=-x;//入队
			fushu++;//如果队列里面没有负数了,就说明它在一个圈里出不来
		//	printf("mm[%d]=%d\t",x,mm[x]);
		}
		else 
		{
			mm[x]=mm[queue[base]]+1;
			queue[top++]=x;
			zhengshu++;  // 同上
		//	printf("mm[%d]=%d\t",x,mm[x]);
		}
	}
	else//如果这个点标记过
	{
		if(queue[base]<0&&mm[x]>0)//如果符号不相同的就说明路通了,输出结果
		{
			result=mm[x]-mm[-queue[base]]-1;
			return(true);
		}
		else if(queue[base]>0&&mm[x]<0)
		{
			result=mm[queue[base]]-mm[x]-1;
			return(true);
		}
	}
	return(false);//如果符号相同,就不操作
}
int main()
{
/*	g();               //画的图,可以看看f()函数写的对不对
	int i,j;
	f(100);
	int term=shang;
	for(i=0;i<10;i++)
	{
		f(term);
		term=xia;
		for(j=0,you=term;j<10;j++)
		{
			if(sushu[you])printf("%5d",you);
			else printf("     ");
			f(you);
		}
		putchar(10);
	}
*/




	int x,y,qq;
	g();//求出1w以内的素数
	while(~scanf("%d%d",&x,&y))
	{
		printf("Case %d: ",++num);
		if(x==0||y==0)break;
		if(sushu[y])
		{
			printf("impossible\n");
			continue;
		}
		if(x==y)
		{
			printf("0\n");
			continue;
		}
		qq=0;
		if(sushu[x])qq=1,sushu[x]=0;  //为了迎合测试数据的错误,只能这样了。。。
		memset(mm,0,sizeof(mm));
		result=0;
		top=base=0;
		queue[top++]=x;
		queue[top++]=-y;//队列里面正的是从x开始搜,负的是从y开始搜
		mm[x]=1;mm[y]=-1;//标记步数
		fushu=zhengshu=1;//初始化
		while(top!=base)
		{
			f(queue[base]);//求出上下左右四个数
			if(r(shang)||r(xia)||r(zuo)||r(you))break;//一个一个判断入队,如果找到通路,就跳出
			if(queue[base]<0)fushu--;//看看出队的是负数还是正数,标记一下
			else zhengshu--;
			if(fushu<=0||zhengshu<=0)break;
			base++;
		}
		if(result)printf("%d\n",result);//如果result不为0,就输出
		else printf("impossible\n");
		if(qq)sushu[x]=1;
	}
	return(0);
}
/*
就因为那错误的测试数据,让我想了一天,调试了一天。
AC的时候,当场飙泪!有种被欺负的感觉....
*/

 

分享到:
评论

相关推荐

    南阳理工oj离线题库

    南阳理工oj离线题库是为编程爱好者和学习者提供的一种资源,主要用于练习和提高编程技能。这个离线题库通常包含多种类型的编程题目,涵盖了数据结构、算法、计算机科学基础等多个方面。在这个环境中,用户可以不受...

    南阳理工学院OJ_个人AC代码包(Java提交)

    【南阳理工学院OJ_个人AC代码包(Java提交)】是针对Java初学者的一份宝贵资源,它包含了参与ACM国际大学生程序设计竞赛(ICPC)时在南阳理工学院在线评测系统(OJ)上获得正确答案的代码实例。这些代码展示了如何用...

    南阳理工学院OJ第1版解题报告V1.0.pdf

    ### 南阳理工学院OJ第1版解题报告概览 #### 1. A+B Problem 虽然解题思路在报告中被省略,但我们可以推测这是一个基础的数学加法问题,涉及到数字输入与基本算术操作。此类题目旨在测试初学者对编程语言基本输入...

    南阳理工oj stl练习ac代码

    南阳理工的OJ平台可能包含ACM风格的题目,比如动态规划、图论、搜索等问题,通过AC代码,我们可以学习如何在有限的时间内构造高效解决方案。 6. NYOJ系统: NYOJ(南阳理工在线判题系统)是南阳理工学院开发的OJ...

    湖南理工oj题解(学习用)-共230道题

    【标题】:“湖南理工oj题解(学习用)-共230道题”揭示了这是一个针对湖南理工大学在线编程竞赛平台(Online Judge,简称OJ)的题解集合,包含了230个不同题目。这类资源通常由参赛者或者经验丰富的程序员整理,...

    哈理工oj 1084百步穿杨

    哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案

    湖南理工学院OJ-小鱼比可爱

    湖南理工学院小鱼比可爱OJ题

    oj刷题 西安理工大学学生在线实验系统编程题答案(超级详细)

    这个“oj刷题”压缩包文件很可能是包含了西安理工大学在线实验系统中的一些典型题目,包括但不限于排序算法(如冒泡排序、快速排序、归并排序)、搜索算法(如二分查找、深度优先搜索、广度优先搜索)、图论问题(如...

    基于Laravel 5.0的OJ题解网站 , 目前涵盖安科OJ,南阳OJ,杭电OJ ,北大OJ,浙大OJ.zip

    【描述】中提到的“目前涵盖安科OJ,南阳OJ,杭电OJ,北大OJ,浙大OJ”意味着这个题解网站已经集成了多个知名OJ平台的题目,用户可以在一个统一的平台上找到这些不同OJ的题目并查看解决方案。安科OJ、南阳OJ、杭电OJ...

    纯素数问题(OJ上的纯素数问题)

    要求按照从小到大的顺序,依次输出所有的4位纯素数。每个4位纯素数输出一行。

    山东理工大学2016级OJ题1832

    2. **数学函数**:题目涉及到了数学中的平方根函数 `sqrt`,它在 `&lt;math.h&gt;` 头文件中定义,用于计算一个数的平方根。例如在第一个和第二个程序中,都使用了 `sqrt` 函数来计算数列的项。 3. **循环结构**:在计算...

    山东理工大学2016级OJ题目1833

    山东理工大学2016级OJ题目1833 在这篇文章中,我们将讨论山东理工大学2016级OJ题目1833所涉及到的知识点。该题目共包含四个子题目,分别是最值问题、整数位问题、小鑫数数儿问题和卡片游戏问题。 最值问题 在该...

    西南科技大学OJ题答案

    2. **蛇形填数(1183)**:这是一个经典的矩阵操作问题,通常涉及到二维数组的遍历。蛇形填充意味着需要按照“之”字形顺序填充或打印矩阵元素,这需要对数组的行和列有良好的控制。 3. **字符串排序(0559)**:这个...

    趣味题:柱状图排序 西安理工大学学生在线实验系统 oj

    趣味题:柱状图排序 西安理工大学学生在线实验系统 oj

    竞赛题集南阳OJ部分习题及解答其他oj试题及解答

    竞赛题集南阳OJ部分习题及解答其他oj试题及解答提取方式是百度网盘分享地址

    OJ部分习题及解答(c语言)

    "OJ部分习题及解答(c语言)"这个压缩包显然包含了若干编程挑战的源代码,旨在帮助学习者通过实例深入理解C语言编程。这些题目涵盖了许多常见的算法思想,如逻辑推理、数学计算、字符串处理等,是提升编程能力和解决...

    湖南理工学院OJ-阶乘求和-定义函数

    湖南理工学院OJ-阶乘求和-定义函数

    湖南理工学院Oj-等腰三角形-嵌套循环

    湖南理工学院Oj-等腰三角形-嵌套循环

    练习题(含答案)_c++oj答案_c++类oj习题_

    这个压缩包文件"练习题(含答案)_c++oj答案_c++类oj习题_"似乎包含了一系列关于C++类与对象的在线判断题(Online Judge, OJ)解答,这对于学习者来说是一个宝贵的资源,可以帮助他们检验和提升在类和对象方面的理解...

    郑州轻工业oj;C语言200道题压缩包

    郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;郑州轻工业oj;C语言200道题压缩包;...

Global site tag (gtag.js) - Google Analytics