• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

sicily 1444 Prime Path bfs

        bfs, 这题WA了好几次,百思不得其解,后来发现判断状态是否合法是想错了,误认为一定要在给定两个数范围内,其实只要是4位数就可以

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

struct state
{
	char num[5];
	int pounds;
	state(char num[]) {strcpy(this->num, num); pounds = 0;}
	state() {pounds = 0;}
};
bool isvisit[10][10][10][10];
bool isPrime[10005]; //素数表
char start[5], goal[5];

void bfs();
void makePrime();

int main()
{
	int n;
	makePrime();
	cin >> n;
	
	for (int i = 0; i < n; i++)
	{
		cin >> start >> goal;		
		bfs();
	}
	return 0;
}

void bfs()
{
	memset(isvisit, false, sizeof(isvisit));

	queue<state> Q;
	Q.push(state(start));
	int result;
	state tmp, hold;
	while (!Q.empty())
	{
		tmp = Q.front();
		Q.pop();

		if (strcmp(tmp.num, goal) == 0)
		{
			cout << tmp.pounds << endl;
			return;
		}

		for (int i = 0; i < 4; i++)
			for (int j = 0; j < 10; j++)
			{
				strcpy(hold.num, tmp.num);
				hold.num[i] = j+'0';
				hold.pounds = tmp.pounds + 1;
				result = atoi(hold.num);

				//注意,result可以不在[start, goal]范围内!
				if ( result > 1000 && result <= 9999 &&
					 isPrime[result]   &&
					!isvisit[hold.num[0]-'0'][hold.num[1]-'0'][hold.num[2]-'0'][hold.num[3]-'0'])
				{
					isvisit[hold.num[0]-'0'][hold.num[1]-'0'][hold.num[2]-'0'][hold.num[3]-'0'] = true;
					Q.push(hold);
				}
			}
	}
	cout << "Impossible" << endl;
}

//筛选法求1~10000之间素数
void makePrime()
{
	int i, j;
	memset(isPrime, true, sizeof(isPrime));
	isPrime[0] = false;
	isPrime[1] = false;

	for (i = 2; i*i < 10000; i++)
	{
		if (isPrime[i])
		{
			for (j = 2; j*i < 10000; j++)
				isPrime[j*i] = false;
		}
	}
}

posted on 2010-11-20 20:43  sysuwhj  阅读(605)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3