【非图BFS+STL】电脑修好了—Open the Lock_HDU 1195

电脑折腾了三天总算修好了…C盘出现了一片bad sector…虽然以前写的ACM都没了,启动的也特别慢,但毕竟是修好了,于是又开始了。

涉足了一下自己最害怕的BFS(虽然这个对别人来说是弱智级别的),非图的+STL。

大意是一个四位密码锁,有两种方式,都算一步:

1、前后的+1和-1.

2、相邻两个调换顺序.

从一个密码到目标密码需要几步。

加上个STACK,跌跌撞撞的卡TIME AC了。。。据说网上说二分BFS更好,但是不会……ORZ

#include <iostream>
#include <stdlib.h>
#include <queue>
#include <string>
using namespace std;

class passwd
{
	public:
		int num[4];
		int step;
};

bool visited[10][10][10][10];
int flag;

void BFS(passwd initer,passwd traget)
{
	memset(visited,0,sizeof(visited));
	queue<passwd> q;
	passwd start=initer;
	passwd end;
	start.step=0;
	q.push(start);
	visited[start.num[0]][start.num[1]][start.num[2]][start.num[3]]=true;
	while(!q.empty())
	{
		start=q.front();
		q.pop();
		int tg=0;
		for(int a=0;a<4;a++)
		{
			if(start.num[a]==traget.num[a])
			{
				tg++;
			}
		}
		if(tg==4)
		{
			cout<<start.step<<endl;
			return;
		}

		
		//+1开搜
		for(int i=0;i<4;i++)
		{
			end=start;
			if(start.num[i]==9)
			{
				end.num[i]=1;
			}
			else
			{
				end.num[i]=start.num[i]+1;
			}
			if(visited[end.num[0]][end.num[1]][end.num[2]][end.num[3]]==0)
			{
				visited[end.num[0]][end.num[1]][end.num[2]][end.num[3]]=1;
				end.step=start.step+1;
				q.push(end);
				
			}
				
		} 
		
		//-1开搜
		for(int i=0;i<4;i++)
		{
			end=start;
			if(start.num[i]==1)
			{
				end.num[i]=9;
			}
			else
			{
				end.num[i]=start.num[i]-1;
			}
			if(visited[end.num[0]][end.num[1]][end.num[2]][end.num[3]]==0)
			{
				visited[end.num[0]][end.num[1]][end.num[2]][end.num[3]]=1;
				end.step=start.step+1;
				q.push(end);
				
			}

		} 
		
		//交换开搜
		for(int i=0;i<3;i++)
		{
			end=start;
			end.num[i]=start.num[i+1];
			end.num[i+1]=start.num[i];
			if(visited[end.num[0]][end.num[1]][end.num[2]][end.num[3]]==0)
			{
				visited[end.num[0]][end.num[1]][end.num[2]][end.num[3]]=1;
				end.step=start.step+1;
				q.push(end);
				
			}
		} 
		
		//搜完了偶也~ 
	}
}

int main()
{
	string startstr,endstr;
	passwd c1,c2;
	int testcase;
	cin>>testcase;
	for(int j=0;j<testcase;j++)
	{
		cin>>startstr>>endstr;
		for(int i=0;i<4;i++)
		{
			c1.num[i]=startstr[i]-'0';
			c2.num[i]=endstr[i]-'0';
			c1.step=0;
			c2.step=0;
		}
		BFS(c1,c2);
	}
	
	return 0;
}


PS:我也不知道为什么有这么多访问量,我似乎也没放种子吧……


你可能感兴趣的:(【非图BFS+STL】电脑修好了—Open the Lock_HDU 1195)