| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
吃鲸!感觉写了好长的代码,居然一遍过了w(゚Д゚)w最近才学会bfs,写了蛮长的代码,验样例的时候虽然都是对的,但是还是有点没把握,以为要卡,没想到过了。
思路是将这个四位数拆分成四个整形变量,逐个对四个数字分别用0~9之间(千位数特殊:1~9)除本身的数字替换,替换单个数字之后的四位数的数必须是之前没有变换到的数(用vis[]数组检查状态),检查是否为素数。
贴一下bfs的代码,有点长,如果有错误请大佬们指点!
void bfs(int start, int e) {
t1.num = start;
t1.ans = 0;
vis[t1.num] = 1;
q.push(t1);
while (!q.empty()) {
t1 = q.front();
q.pop();
int temp,a,b,c,d;
for (int i = 0; i < 4; i++) {
d = t1.num%10;c = t1.num/10%10;
b = t1.num/100%10; a = t1.num/1000;
if (i == 0) {
for(int j = 1; j <= 9; j++) {
if (j != a) {
temp = j*1000+b*100+c*10+d;
if (check(temp) && !vis[temp]) {
t2.num = temp;
t2.ans = t1.ans+1;
if (t2.num == e) {
printf("%d\n", t2.ans);
return;
}
vis[t2.num] = 1;
q.push(t2);
}
}
}
}
if (i == 1) {
for (int j = 0; j <= 9; j++) {
if (j != b) {
temp = a*1000+j*100+c*10+d;
if (check(temp) && !vis[temp]) {
t2.num = temp;
t2.ans = t1.ans+1;
if (t2.num == e) {
printf("%d\n", t2.ans);
return;
}
vis[t2.num] = 1;
q.push(t2);
}
}
}
}
if (i == 2) {
for (int j = 0; j <= 9; j++) {
if (j != c) {
temp = a*1000+b*100+j*10+d;
if (check(temp) && !vis[temp]) {
t2.num = temp;
t2.ans = t1.ans+1;
if (t2.num == e) {
printf("%d\n", t2.ans);
return;
}
vis[t2.num] = 1;
q.push(t2);
}
}
}
}
if (i == 3) {
for (int j = 0; j <= 9; j++) {
if (j != d) {
temp = a*1000+b*100+c*10+j;
if (check(temp) && !vis[temp]) {
t2.num = temp;
t2.ans = t1.ans+1;
if (t2.num == e) {
printf("%d\n", t2.ans);
return;
}
vis[t2.num] = 1;
q.push(t2);
}
}
}
}
}
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator