poj2488

今天不不知道中了什么邪了,这道曾经写过的马步图问题竟然,用树的深度优先遍历去做(用栈结构+回溯),花了半天也没写对。在纸上写,感觉想明白了就在电脑上敲,敲完总也运行不出想要的结果。整地头晕脑胀地,决定先放着,换一种方法。

用递归实现。(也很周折,有个字母敲错了,提交了好几次,后来才发现)。

啊啊啊啊,哥要疯了!

好郁闷啊。等哥那天状态好了,一定写个启发式搜索的马步图出来。

啊啊啊啊,哥要疯了。


递归代码:

#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int direct[8][2]={{-1,-2},{+1,-2},{-2,-1},{+2,-1},{-2,+1},{+2,+1}
	,	{-1,+2},{+1,+2}};
int n,p,q;
bool visited[100][100];
int output[100][2];
int flag;
void  dfs(int row,int col,int depth)
{
	output[depth][0]=row;
	output[depth][1]=col;
	if(depth==p*q)
	{
		flag=true;
		return ;
	}

	for(int i=0;i<8;i++)
	{
		int next_row=row+direct[i][0];
		int next_col=col+direct[i][1];
		if(flag==false&&next_row>=0&&next_row<p&&next_col>=0&&next_col<q&&visited[next_row][next_col]==false)
		{
			visited[next_row][next_col]=true;
			dfs(next_row,next_col,depth+1);
			visited[next_row][next_col]=false;

		}
	}
}
int main()
{
	freopen("input.txt","r",stdin);
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>p>>q;
		flag=false;
		for(int j=0;j<100;j++)
		{
			memset(visited[j],false,100);
		}
		visited[0][0]=true;
		dfs(0,0,1);
		printf("Scenario #%d:\n",i+1);
		if(flag)
		{
			for(int j = 1;j <= p*q;j++)
			{
				printf("%c",output[j][1]+'A');
				printf("%d",output[j][0]+1);
			}
		}
		else
			printf("impossible");
		printf("\n\n");
	}
              


	return 0;

}

栈+回溯   未完成代码:

#include<iostream>
#include<fstream>
#include<stack>
using namespace std;
int direct[8][2]={{-1,-2},{+1,-2},{-2,-1},{+2,-1},{-2,+1},{+2,+1}
,	{-1,+2},{+1,+2}};
struct Node
{
	int row;
	int col;
	int id;
	int depth;
	Node(int r,int c,int i,int d)
	{
		row=r;
		col=c;
		id=i;
		depth=d;
	}
        bool	isLogical(int p,int q)
	{
	      if(row>=0&&row<p&&col>=0&&col<q)
	      return true;
              return false;	      
	}
};
int main()
{
	freopen("input.txt","r",stdin);
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int p,q;
		cin>>p>>q;
		bool **visited;
		visited=new bool *[p];
		for(int i=0;i<p;i++)
		{
			visited[i]=new bool[q];
			for(int j=0;j<q;j++)
			{
				visited[i][j]=false;
			}
		}
		stack<Node> mystack;
		Node start(0,0,0,0);
		mystack.push(start);
		visited[start.row][start.col]=true;
		const int final=p*q;
		int *output=new int[final*2];
		output[0*0+1]=0;
		output[0*0]=0;
		int last=-1;
		while(mystack.empty()==false&&mystack.size()<final)
		{
			Node temp=mystack.top();
			cout<<temp.row+1<<" "<<temp.col+1<<endl;
			bool flag=false;
			for(int j=last+1;j<8;j++)
			{
				Node next(temp.row+direct[j][0],temp.col+direct[j][1],j,temp.depth+1);

				if(next.isLogical(p,q)&&visited[next.row][next.col]==false)
				{
                                     mystack.push(next);
				     visited[next.row][next.col]=true;
				     flag=true;
				     output[2*next.depth+1]=next.row;
				     output[2*next.depth]=next.col;
				     break;
				}
			}
			if(flag)
			{
                             last=-1;
			}
			else
			{
				mystack.pop();
				if(mystack.empty())
					break;
				visited[temp.row][temp.col]=false;
				last=temp.id;
			}
		}
		if(mystack.empty())
			cout<<"impossible"<<endl;
		else if(mystack.size()==final)
		{
			for(int j=0;j<final;j++)
			{
				cout<<output[2*j+1]+'A'<<output[2*j];
			}
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值