码迷,mamicode.com
首页 > 其他好文 > 详细

foj 2180 超时了

时间:2016-05-13 01:13:37      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

点击打开链接http://acm.fzu.edu.cn/problem.php?pid=2180

#include <stdio.h>
#include <string.h>
#include <memory.h>
typedef struct{
	int x;
	int y;
	
}Move;
Move move[8]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};

int flag,min;
char goal[6][6]={{"11111"},{"01111"},{"00*11"},{"00001"},{"00000"}},str[6][6];

int check()
{
	int i,j,k;
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			if(goal[i][j]!=str[i][j])
			return 0;
		}
	}
	return 1;
}
void exchange(int a,int b,int x,int y)
{
	char c;
	c=str[a][b];
	str[a][b]=str[x][y];
	str[x][y]=c;
	
	
}
void dfs(int cur,int x,int y,int dirx,int diry)
{
	char c;
	int i,j,k,a=x,b=y;
	if(cur<=15&&cur<min) //走重复没关系 因为步数限制在10 不会死循环 
	{
		if(check())
		{
			flag=1;
			if(min>cur)
			{
				min=cur;
				
			}
			return;
			
		}
		
		for(i=0;i<8;i++)
		{
			if(move[i].x==-(dirx)&&move[i].y==-(diry)) continue; //走到下一层 八个方向中 有一个又走到上一层  可以cut 
			a=x+move[i].x;
			b=y+move[i].y;
			if(a>=0&&a<5&&b>=0&&b<5)
			{
			
				exchange(a,b,x,y); //			
				dfs(cur+1,a,b,move[i].x,move[i].y);   		
				exchange(a,b,x,y); //回溯搜索 	
			}	
		}
	}
	
	
	
	
	
}
int main()
{

	int f,t,i,j,k,n,a,b;
	scanf("%d",&t);
	while(t--)
	{
		min=999;
		flag=0;
		for(i=0;i<5;i++)
		{
			scanf("%s",str[i]);
			for(j=0;j<5;j++)
			{
				if(str[i][j]=='*')
				{
					a=i;
					b=j;			
				}	
			}
	
		}
		dfs(0,a,b,-1,-1);
		if(flag)
		printf("%d\n",min);
		else
		printf("Bored!\n");		
	}
	return 0;
}


 

foj 2180 超时了

标签:

原文地址:http://blog.csdn.net/jeremy1149/article/details/51346069

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!