马踏棋盘

<a target=_blank target="_blank" href="http://www.doudou.in/play/27-mtqp/?code=011affb6cfb69a633033d1add3f55e8j&isappinstalled=0&state=STATE&from=timeline#rd" style="text-decoration: none; color: rgb(34, 161, 219); overflow: hidden; font-family: 'Microsoft Yahei', Tahoma; line-height: 18px; white-space: nowrap;"><span style="font-family:punctuation, Hiragino Sans GB, Helvetica Neue, 微软雅黑, Tohoma;color:#5d7895;"><span style="overflow: hidden; line-height: 22px; white-space: nowrap; cursor: pointer; font-size: 14px;">马踏棋盘-豆豆游戏</span></span><span style="text-decoration: none; color: rgb(51, 51, 51); overflow: hidden; font-family: punctuation, 'Hiragino Sans GB', 'Helvetica Neue', 微软雅黑, Tohoma; line-height: 22px; white-space: nowrap; font-size: 14px;"> </span></a>,此游戏是在浏览QQ空间,见到一位好友转载的,号称无人能走完,怀着疑问的心态,打开游戏连接,的确,第一把游戏7步Gameover,不满失败的挫折,第二把30步以失败告终,由于本人是计算机专业,就尝试用C++进行编码,耗时一个多小时,编写算法时也特别苦恼,苦苦不出结果,也存在一些小错误,在室友的悉心劝导下,再接再厉,终于运行成功,奈何算法出现一些小问题,运行耗时比较长,和室友认真研究了一下算法,分析出算法的一些毛病,进行改进,最终调试出结果,但结果却显示如图1,有36步,按照运行结果在游戏中却只能运行34步,<img src="https://img-blog.csdn.net/20150514192148962?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FpbmlhbzE3MTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
又想一会,原来如此简单,太粗心了,少添加了一句语句<span style="white-space:pre">	</span>visit[x][y] = true;,这种错误也不是一次两次了,添加上重新运行
<img src="https://img-blog.csdn.net/20150514192524121?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FpbmlhbzE3MTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
没错,运行结果只能是35步,因为马自己开始还占着一格,按照运行结果,重新玩了一局,哈哈<img src="https://img-blog.csdn.net/20150514192247637?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FpbmlhbzE3MTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
经过调试,感觉还行,现在将源代码附上<pre name="code" class="cpp">#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;

const int maxn = 10+10;
typedef struct aa
{
	int x, y;
}Node;
bool visit[maxn][maxn];
Node pre_temp[maxn][maxn];
Node pre[maxn][maxn];
Node temp[maxn];
int maxnum = -1;
void inital()
{
	for(int i = 0; i < maxn; i++)
	{
		for(int j = 0; j < maxn; j++)
		{
			visit[i][j] = false;
			pre_temp[i][j].x = -1; pre_temp[i][j].y = -1;
		}
	}
	temp[1].x = -1; temp[1].y = -2;
	temp[2].x = -2; temp[2].y = -1;
	temp[3].x = -2; temp[3].y = 1;
	temp[4].x = -1; temp[4].y = 2;
	temp[5].x = 1; temp[5].y = -2;
	temp[6].x = 2; temp[6].y = -1;
	temp[7].x = 2; temp[7].y = 1;
	temp[8].x = 1; temp[8].y = 2;
}

int jump_next(int x, int y)
{
	int count = 0;
	int temp_x = 0, temp_y = 0;
	for(int k = 1; k <= 8; k++)
	{
		temp_x = x+temp[k].x; temp_y = y+temp[k].y;
		if(temp_x<1 ||(temp_x>6))continue;
		if(temp_y<1 ||(temp_y>6))continue;
		if(visit[temp_x][temp_y])continue;
		count = count+1;
	}
	return count;
}
void dfs(int x, int y, int cur_step)
{
	int minnum = 9, tempLocation = 0;
	int temp_x = x, temp_y = y;
	for(int k = 1; k <= 8; k++)
	{
		temp_x = x+temp[k].x; temp_y = y+temp[k].y;
		if(temp_x<1 ||(temp_x>6))continue;
		if(temp_y<1 ||(temp_y>6))continue;
		if(visit[temp_x][temp_y])continue;
		int tempnum = jump_next(temp_x, temp_y);
		if(tempnum < minnum)
		{
			minnum = tempnum;
			tempLocation = k;
		}
	}
	if(tempLocation != 0)
	{
		temp_x = x+temp[tempLocation].x; temp_y = y+temp[tempLocation].y;
		visit[temp_x][temp_y] = true;
		pre_temp[x][y].x = temp_x; pre_temp[x][y].y = temp_y;
		dfs(temp_x,temp_y, cur_step+1);
		visit[temp_x][temp_y] = false;
		pre_temp[x][y].x = pre_temp[x][y].y = -1;
	}
	else 
	{
		if(cur_step > maxnum)
		{
			maxnum = cur_step;
			for(int i = 1; i < 7; i++)
			{
				for(int j = 1; j < 7; j++)
				{
					pre[i][j].x = pre_temp[i][j].x;
					pre[i][j].y = pre_temp[i][j].y;
				}
			}
		}
	}
}

void print(int x, int y)
{
	int temp_x=0, temp_y=0;
	for(; pre[x][y].x !=-1 ||pre[x][y].y !=-1; )
	{
		printf("(%d %d)->",x,y);
		temp_x = pre[x][y].x; temp_y = pre[x][y].y;
		x = temp_x; y = temp_y;
	}
}
int main()
{
	int x = 0, y = 0;
	inital();
	while(scanf("%d %d",&x,&y) != EOF)
	{
	visit[x][y] = true;
		dfs(x,y,0);
		printf("%d\n",maxnum);
		print(x,y);
	}
	return 0;
}


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值