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

HDU4474,POJ1465,HDU1226 一类数位限制倍数的BFS问题

时间:2015-02-03 11:18:14      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

HDU4474,POJ1465,HDU1226,URAL1495这些题目,首先是URAL1495,那天做这个第一个想法就是数位dp,但是没有推测出来,有段时间没做这个了,呃~然后采用了dfs的手法进行记忆化搜索,结果WA出翔了,搞了一下午,而后看了题解用数位DP解决了,但是也发现了一种比较稳妥的方法,比较清晰,而且网上刚好有个巨巨整理出了这一系列
可以戳这里  跳转


而后看了这位巨巨的大致方法做了一下URAL1495,学会了,然后又接下去做了这一个系列,这个方法很好很清晰,所以写下下来保存下来!

做这个系列期间也没有很利索的做完,比如POJ1465,当时我的队列是开在bfs里面的,结果就一直超时,最后随意试了一下才发觉的,交了我无数把啊,另外还有一些模0的问题需要注意,HDU1226稍微加了层迷雾,不过是进制转化罢了


HDU4474:
typedef struct Node {
    int num;
    int mod;
    int len;
};


bool vis[15];


int n,m;


int pre[10][10000 + 55][2];


queue<Node > q;


int Case = 0;


void init() {
    memset(pre,-inf,sizeof(pre));
    memset(vis,false,sizeof(vis));
}


bool input() {
    while(cin>>n>>m) {
        for(int i=0;i<m;i++) {
            int x;
            cin>>x;
            vis[x] = true;
        }
        return false;
    }
    return true;
}


void dfs(int pos,int mod) {
    if(pos == -1)return;
    dfs(pre[pos][mod][0],pre[pos][mod][1]);
    printf("%d",pos);
}


bool bfs() {
    while(!q.empty())q.pop();
    Node s,e;
    for(int i=1;i<10;i++) {
        if(!vis[i]) {
            s.num = i;
            s.mod = i%n;
            s.len = 1;
            pre[i][s.mod][0] = -1;
            q.push(s);
        }
    }
    while(!q.empty()) {
        s = q.front();
        q.pop();
        if(s.mod == 0) {
            dfs(s.num,s.mod);
            return true;
        }
        for(int i=0;i<10;i++) {
            if(!vis[i]) {
                e.num = i;
                e.mod = (s.mod * 10 + i)%n;
                e.len = s.len + 1;
                if(pre[e.num][e.mod][0] >= -1)continue;
                pre[e.num][e.mod][0] = s.num;
                pre[e.num][e.mod][1] = s.mod;
                q.push(e);
            }
        }
    }
    return false;
}


void cal() {
    printf("Case %d: ",++Case);
    if(!bfs()){puts("-1");return;}
    puts("");
}


void output() {


}


int main() {
    while(true) {
        init();
        if(input())return 0;
        cal();
        output();
    }
    return 0;
}





POJ1465:


typedef struct Node {
	int num;
	int mod;
	int len;
};


int nnum[100];


int n,m;


int pre[10][5500 + 55][2];


queue<Node > q;


void init() {
	memset(pre,-inf,sizeof(pre));
}


bool input() {
	while(cin>>n>>m) {
		for(int i=0;i<m;i++)cin>>nnum[i];
		return false;
	}
	return true;
}


void dfs(int pos,int mod) {
	if(pos == -1)return;
	dfs(pre[pos][mod][0],pre[pos][mod][1]);
	printf("%d",pos);
}


bool bfs() {
	while(!q.empty())q.pop();
	Node s,e;
	for(int i=0;i<m;i++) {
		if(nnum[i]) {
			s.num = nnum[i];
			s.mod = nnum[i]%n;
			s.len = 1;
			pre[nnum[i]][s.mod][0] = -1;
			q.push(s);
		}
	}
	while(!q.empty()) {
		s = q.front();
		q.pop();
		if(s.mod == 0) {
			dfs(s.num,s.mod);
			return true;
		}
		for(int i=0;i<m;i++) {
			e.num = nnum[i];
			e.mod = (s.mod * 10 + nnum[i])%n;
			e.len = s.len + 1;
			if(pre[e.num][e.mod][0] >= -1)continue;
			pre[e.num][e.mod][0] = s.num;
			pre[e.num][e.mod][1] = s.mod;
			q.push(e);
		}
	}
	return false;
}


void cal() {
	if(n == 0){puts("0");return ;}
	sort(nnum,nnum + m);
	if(!bfs()){puts("0");return;}
	puts("");
}


void output() {


}


int main() {
	while(true) {
		init();
		if(input())return 0;
		cal();
		output();
	}
	return 0;
}






HDU1226:


typedef struct Node {
    int num;
    int mod;
    int len;
};


bool vis[20 + 5];


int n,cc,m;


int pre[20 + 5][5000 + 55][2];


queue<Node > q;




int Case = 0;


void init() {
    memset(pre,-inf,sizeof(pre));
    memset(vis,false,sizeof(vis));
}


bool input() {
    while(cin>>n>>cc>>m) {
        char s[100000 + 5];
        for(int i=0;i<m;i++) {
            scanf("%s",s);
            int len = strlen(s);
            int tmp = 0;
            for(int i=0;i<len;i++) {
                if(s[i] >= '0' && s[i] <= '9')
                    tmp = tmp * 10 + s[i] - '0';
                else 
                    tmp = tmp * 10 + s[i] - 'A' + 10;
            }
            vis[tmp] = true;
        }
        return false;
    }
    return true;
}


void dfs(int pos,int mod) {
    if(pos == -1)return;
    dfs(pre[pos][mod][0],pre[pos][mod][1]);
    if(pos < 10)printf("%d",pos);
    else printf("%c",pos - 10 + 'A');
}


bool bfs() {
    while(!q.empty())q.pop();
    Node s,e;
    for(int i=1;i<cc;i++) {
        if(vis[i]) {
            s.num = i;
            s.mod = i%n;
            s.len = 1;
            pre[i][s.mod][0] = -1;
            q.push(s);
        }
    }
    while(!q.empty()) {
        s = q.front();
        q.pop();
        if(s.len > 500)return false;
        if(s.mod == 0) {
            dfs(s.num,s.mod);
            return true;
        }
        for(int i=0;i<cc;i++) {
            if(vis[i]) {
                e.num = i;
                e.mod = (s.mod * cc + i)%n;
                e.len = s.len + 1;
                if(pre[e.num][e.mod][0] >= -1)continue;
                //cout<<e.num<<e.mod<<"******"<<endl;
                pre[e.num][e.mod][0] = s.num;
                pre[e.num][e.mod][1] = s.mod;
                q.push(e);
            }
        }
    }
    return false;
}


void cal() {
    if(n == 0) {
        if(vis[0])puts("0");
        else puts("give me the bomb please");
        return ;
    }
    if(!bfs()){puts("give me the bomb please");return ;}
    puts("");
}


void output() {


}


int main() {
    int t;
    cin>>t;
    while(t--) {
        init();
        if(input())return 0;
        cal();
        output();
    }
    return 0;
}







URAL1495:


int n;


typedef struct Node {
	int len;
	int digit;
	int mod;
};


int pre[3][1000000 + 55][2];


void init() {
	memset(pre,-inf,sizeof(pre));
}


bool input() {
	while(cin>>n) {
		return false;
	}
	return true;
}


void dfs(int digit,int mod) {
	if(digit == -1)return ;
	dfs(pre[digit][mod][0],pre[digit][mod][1]);
	printf("%d",digit);
}


bool bfs() {
	Node s,e;
	queue<Node> q;
	for(int i=1;i<=2;i++) {
		s.digit = i;
		s.mod = i%n;
		s.len = 1;
		pre[s.digit][s.mod][0] = -1;
		q.push(s);
	}
	while(!q.empty()) {
		s = q.front();
		q.pop();
		if(s.len > 30)return false;
		if(s.mod == 0) {
			dfs(s.digit,s.mod);
			return true;
		}
		for(int i=1;i<=2;i++) {
			e.digit = i;
			e.len = s.len + 1;
			e.mod = (s.mod * 10 + i)%n;
			if(pre[e.digit][e.mod][0] >= -1)continue;
			pre[e.digit][e.mod][0] = s.digit;
			pre[e.digit][e.mod][1] = s.mod;
			q.push(e);
		}
	}
	return false;
}


void cal() {
	if(n%10 == 0 || n%10 == 5) {puts("Impossible");return;}
	if(!bfs()){puts("Impossible");return;}
	puts("");
}


void output() {


}


int main() {
	while(true) {
		init();
		if(input())return 0;
		cal();
		output();
	}
	return 0;
}


HDU4474,POJ1465,HDU1226 一类数位限制倍数的BFS问题

标签:

原文地址:http://blog.csdn.net/yitiaodacaidog/article/details/43445697

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