ZOJ1438 : http://acm.zju.edu.cn/show_problem.php?pid=1438
一道最基础的BFS题,就是求在三维迷宫中从一个点到另外一个点的最短距离.
就是在输入的时候它不像以前那样先行再列最后层数,要小心
/*
* 简单的BFS
* 由于输入问题一开始WA了n次
*/
#include <iostream>
#include <deque>
#include <string>
using namespace std ;
struct Node
{
int x, y, z ;
}temp, t, aim ;
deque<Node> de[2] ;
bool mark[12][12][12] ;
char maze[12][12][12] ;
int Size, step ;
int walk[6][3] ;
bool operator ==(Node &a, Node &b)
{
if ( a.x == b.x && a.y == b.y && a.z == b.z ) return true ;
return false ;
}
void initi()
{
int i, j, k ;
for ( k = 0 ; k < Size ; k++ ) {
for ( j = 0 ; j < Size ; j++ ) {
getchar() ;
for ( i = 0 ; i < Size ; i++ ) {
scanf ( "%c", &maze[i][j][k] ) ;
mark[i][j][k] = false ;
}
}
}
scanf ( "%d%d%d", &temp.x, &temp.y, &temp.z ) ;
scanf ( "%d%d%d", &aim.x, &aim.y, &aim.z ) ;
mark[temp.x][temp.y][temp.z] = true ;
de[0].clear() ; de[1].clear() ;
de[0].push_back(temp) ;
step = 0 ;
}
void work()
{
int now = 0, n, i ;
while ( !de[0].empty() || !de[1].empty() ) {
n = now^1 ;
while ( !de[now].empty() ) {
temp = de[now].front() ;
de[now].pop_front() ;
if ( temp == aim ) {
printf ( "%d %d/n", Size, step ) ;
return ;
}
for ( i = 0 ; i < 6 ; i++ ) {
t.x = temp.x+walk[i][0] ;
t.y = temp.y+walk[i][1] ;
t.z = temp.z+walk[i][2] ;
if ( t.x < 0 || t.y < 0 || t.z < 0
|| t.x >= Size || t.y >= Size || t.z >= Size ) continue ;
if ( maze[t.x][t.y][t.z] == 'O' && !mark[t.x][t.y][t.z] ) {
mark[t.x][t.y][t.z] = true ;
de[n].push_back(t) ;
}
}
}
now = n ;
step ++ ;
}
printf ( "NO ROUTE/n" ) ;
}
void init()
{
walk[0][0] = 1 ; walk[0][1] = 0 ; walk[0][2] = 0 ;
walk[1][0] = 0 ; walk[1][1] = 1 ; walk[1][2] = 0 ;
walk[2][0] = 0 ; walk[2][1] = 0 ; walk[2][2] = 1 ;
walk[3][0] = -1 ; walk[3][1] = 0 ; walk[3][2] = 0 ;
walk[4][0] = 0 ; walk[4][1] = -1 ; walk[4][2] = 0 ;
walk[5][0] = 0 ; walk[5][1] = 0 ; walk[5][2] = -1 ;
}
int main ( void )
{
string str ;
init() ;
while ( cin >> str >> Size ) {
initi() ;
cin >> str ;
work() ;
}
return 0 ;
}
ZOJ2050 : http://acm.zju.edu.cn/show_problem.php?pid=2050
题目意思就是从输入状态一直换,知道矩阵中全是b状态或者全是w状态,换的方法是随便从矩阵中选一个值出来,和它相临的全部取反(包括它自己这个点也取反).
就是BFS从一个状态换到另外一个状态的最少步数,关键在于如何存状态,由于位数是确定的,所以想到用16位的位运算.
/*
* 0.07s BFS
*/
#include <iostream>
#include <deque>
using namespace std ;
deque<int> de[2] ;
int value[18], walk[5][2] ;
bool mark[65536] ;
int step ;
void initi()
{
int i, j ;
int num = 0 ;
char ch ;
for ( i = 0 ; i < 4 ; i++ ) {
while ( ch = getchar() ) {
if ( ch == 'b' || ch =='w' ) break ;
}
num = num << 1 ;
if ( ch == 'b' ) num ++ ;
for ( j = 0 ; j < 3 ; j++ ) {
ch = getchar() ;
num = num << 1 ;
if ( ch == 'b' ) num ++ ;
}
}
de[0].clear() ; de[1].clear() ;
de[0].push_back(num) ;
step = 0 ;
memset(mark,false,sizeof(mark)) ;
mark[num] = true ;
}
void work()
{
int now = 0, n, i, j, k ;
int temp ;
while ( !de[0].empty() || !de[1].empty() ) {
n = now^1 ;
while ( !de[now].empty() ) {
temp = de[now].front() ;
de[now].pop_front() ;
if ( temp == 0 || temp == 65535 ) { cout << step << endl ; return ; }
int x, y ;
for ( i = 0 ; i < 4 ; i++ ) {
for ( j = 0 ; j < 4 ; j++ ) {
x = temp ;
for( k = 0 ; k < 5 ; k++ ) {
int a = i+walk[k][0] ;
int b = j+walk[k][1] ;
if ( a < 0 || b < 0 || a >= 4 || b >= 4 ) continue ;
y = 16-(a*4+b) ;
if ( 1&(x>>y-1) ) {
x = ~x ;
x = x|value[y] ;
x = ~x ;
}
else x = x|value[y] ;
}
if ( !mark[x] ) { de[n].push_back(x) ; mark[x] = true ; }
}
}
}
now = n ;
step ++ ;
}
cout << "Impossible" << endl ;
}
void init()
{
walk[4][0] = 0 ; walk[4][1] = 0 ;
walk[0][0] = 1 ; walk[0][1] = 0 ;
walk[1][0] = 0 ; walk[1][1] = 1 ;
walk[2][0] = -1 ; walk[2][1] = 0 ;
walk[3][0] = 0 ; walk[3][1] = -1 ;
int num = 1, i ;
value[1] = 1 ;
for ( i = 2 ; i <= 16 ; i++ ) {
num = num << 1 ;
value[i] = num ;
}
}
int main ( void )
{
int T ;
init() ;
scanf ( "%d", &T ) ;
while ( T -- ) {
initi() ;
work() ;
if ( T ) cout << endl ;
}
return 0 ;
}
ZOJ2081 : http://acm.zju.edu.cn/show_problem.php?pid=2081
题目意思大概就是在一个二维迷宫中从一个点到另外一个点存在很多最短路,但是迷宫中有炸弹存在,问最短路中有多少条是没有经过炸弹的,输出它的百分比.
就用BFS求最短路并标记有炸弹的路
/*
* 0.00s BFS
*/
#include <iostream>
#include <deque>
using namespace std ;
#define MAXN 10000000
struct Node
{
int x, y ;
bool ok ;
}temp, t ;
deque<Node> de[2] ;
int step, row, column, e_x, e_y ;
char maze[12][12] ;
int mark[12][12] ;
int walk[4][2] ;
void work()
{
int now = 0, n, i ;
int die = 0, live = 0 ;
step = 1 ;
while ( !de[0].empty() || !de[1].empty() ) {
n = now^1 ;
bool loop = false ;
while ( !de[now].empty() ) {
temp = de[now].front() ;
de[now].pop_front() ;
for ( i = 0 ; i < 4 ; i++ ) {
t.x = temp.x+walk[i][0] ;
t.y = temp.y+walk[i][1] ;
if ( t.x < 0 || t.y < 0 || t.x >= row || t.y >= column ) continue ;
if ( step > mark[t.x][t.y] ) continue ;
if ( maze[t.x][t.y] == 'M' ) {
t.ok = true ;
de[n].push_back(t) ;
}
else if ( maze[t.x][t.y] == 'T' ) {
if ( temp.ok ) die ++ ;
else live ++ ;
loop = true ;
break ;
}
else if ( maze[t.x][t.y] == ' ' ) {
t.ok = temp.ok ;
de[n].push_back(t) ;
}
mark[t.x][t.y] = step ;
}
}
if ( loop ) {
if ( live > 0 )
printf ( "The probability for the spy to get to the telegraph transmitter is %.2lf/%%./n", double(live)/(double(live)+double(die))*100.0 ) ;
else printf ( "Mission Impossible./n" ) ;
return ;
}
now = n ;
step ++ ;
}
printf ( "Mission Impossible./n" ) ;
}
void initi()
{
walk[0][0] = -1 ; walk[0][1] = 0 ;
walk[1][0] = 0 ; walk[1][1] = -1 ;
walk[2][0] = 1 ; walk[2][1] = 0 ;
walk[3][0] = 0 ; walk[3][1] = 1 ;
}
int main ( void )
{
int T, i, j, k ;
initi() ;
scanf ( "%d", &T ) ;
for ( k = 1 ; k <= T ; k++ ) {
de[0].clear() ; de[1].clear() ;
scanf ( "%d%d", &row, &column ) ;
for ( i = 0 ; i < row ; i++ ) {
getchar() ;
for ( j = 0 ; j < column ; j++ ) {
scanf ( "%c", &maze[i][j] ) ;
mark[i][j] = MAXN ;
if ( maze[i][j] == 'S' ) {
temp.x = i ; temp.y = j ;
temp.ok = false ;
mark[i][j] = 0 ;
de[0].push_back(temp) ;
}
else if ( maze[i][j] == 'T' ) {
e_x = i ; e_y = j ;
}
}
}
printf ( "Mission #%d:/n", k ) ;
work() ;
printf ( "/n" ) ;
}
return 0 ;
}
以下都是一些BFS的题目:
ZOJ1310 : http://acm.zju.edu.cn/show_problem.php?pid=1310
/*
* 0.05 BFS
*/
#include <iostream>
#include <deque>
#include <string>
using namespace std ;
#define North 0
#define East 1
#define South 2
#define West 3
struct Node
{
int x, y ;
int towards ;
}temp, t ;
int step, B1, B2, E1, E2, S ;
int walk[4][2], store[52][52], row, column ;
bool mark[52][52][4] ;
deque<Node> de[2] ;
void initi1()
{
walk[North][0] = -1 ; walk[North][1] = 0 ;
walk[East][0] = 0 ; walk[East][1] = 1 ;
walk[South][0] = 1 ; walk[South][1] = 0 ;
walk[West][0] = 0 ; walk[West][1] = -1 ;
}
void initi2()
{
int i, j, k ;
for ( i = 0 ; i < row ; i++ ) {
for ( j = 0 ; j < column ; j++ ) {
scanf ( "%d", &store[i][j] ) ;
}
}
scanf ( "%d%d%d%d", &B1, &B2, &E1, &E2 ) ;
string str ;
cin >> str ;
if ( str == "south" ) S = South ;
else if ( str == "east" ) S = East ;
else if ( str == "west" ) S = West ;
else if ( str == "north") S = North ;
de[0].clear() ; de[1].clear() ;
step = 0 ;
for ( i = 0 ; i < row ; i++ ) {
for ( j = 0 ; j < column ; j++ ) {
for ( k = 0 ; k < 4 ; k++ ) {
mark[i][j][k] = false ;
}
}
}
temp.x = B1-1 ; temp.y = B2-1 ;
E1 -- ; E2 -- ;
temp.towards = S ;
mark[temp.x][temp.y][temp.towards] = true ;
de[0].push_back(temp) ;
}
bool judge()
{
if ( temp.towards == North ) {
if ( temp.y+1 >= column ) return false ;
if ( store[temp.x-1][temp.y] == 1 ) return false ;
if ( store[temp.x-1][temp.y+1] == 1 ) return false ;
}
if ( temp.towards == South ) {
if ( temp.x+2 >= row || temp.y+1 >= column ) return false ;
if ( store[temp.x+2][temp.y] == 1 ) return false ;
if ( store[temp.x+2][temp.y+1] == 1 ) return false ;
}
if ( temp.towards == East ) {
if ( temp.y+2 >= column || temp.x+1 >= row ) return false ;
if ( store[temp.x][temp.y+2] == 1 ) return false ;
if ( store[temp.x+1][temp.y+2] == 1 ) return false ;
}
if ( temp.towards == West ) {
if ( temp.x+1 >= row ) return false ;
if ( store[temp.x][temp.y-1] == 1 ) return false ;
if ( store[temp.x+1][temp.y-1] == 1 ) return false ;
}
return true ;
}
int BFS()
{
int now = 0 ;
while ( !de[0].empty() || !de[1].empty() ) {
int n = now^1 ;
while ( !de[now].empty() ) {
temp = de[now].front() ;
de[now].pop_front() ;
if ( temp.x == E1 && temp.y == E2 ) return step ;
t = temp ;
t.towards = (temp.towards+1)%4 ;
if ( !mark[t.x][t.y][t.towards] ) {
mark[t.x][t.y][t.towards] = true ;
de[n].push_back(t) ;
}
t.towards = temp.towards-1 ;
if ( t.towards == -1 ) t.towards = 3 ;
if ( !mark[t.x][t.y][t.towards] ) {
mark[t.x][t.y][t.towards] = true ;
de[n].push_back(t) ;
}
t = temp ;
for ( int i = 0 ; i < 3 ; i++ ) {
temp = t ;
t.x += walk[t.towards][0] ;
t.y += walk[t.towards][1] ;
if ( t.x < 0 || t.x >= row || t.y < 0 || t.y >= column ) break ;
if ( !judge() ) break ;
if ( !mark[t.x][t.y][t.towards] ) {
mark[t.x][t.y][t.towards] = true ;
de[n].push_back(t) ;
}
}
}
step ++ ;
now = n ;
}
return -1 ;
}
int main ( void )
{
initi1() ;
while ( 2 == scanf ( "%d%d", &row, &column ) ) {
if ( row == 0 && column == 0 ) break ;
initi2() ;
int ans = BFS() ;
printf ( "%d/n", ans ) ;
}
return 0 ;
}
ZOJ1671 : http://acm.zju.edu.cn/show_problem.php?pid=1671
/*
ZOJ1671 2006-10-3 21:45
Times : 0ms menory : 840
ant 从出发点开始,上下左右的走。每走一步消耗一个体力值。
它出发时的体力值为6.走到食物所在的格就可以将体力又回到
6。问最少走多少步到洞口,也就是它的目的地.如果不能就输出
-1.注意当它在某个格子体力值为1,那么当它移动时体力就要下
降,那么哪怕下个要走到的格子就有食物或者就是目的地时,
它也不能走到那个格子。
输入:
先给出矩阵的大小N,M,它们在8以内.
下面N行M列代表矩阵的情形,其中2代表出发点。3代表目的地,4代表食物.
1代表可走到的格子,0代表不可走到的格子.
整个测试以二个0代表结束
BFS :
增加一个2维数组记录走到当前位子的life值,若life值比当前位子大则可以走
*/
#include <iostream>
#include <deque>
using namespace std ;
struct pp
{
int x, y, step ;
}temp, t ;
int MAP[12][12], mark[12][12] ;
int row, column ;
bool p ;
deque<pp> de ;
void BFS() ;
bool judge(int x, int y, int step, int life) ;
int main ( void )
{
int i, j ;
for ( i = 0 ; i < 10 ; i++ ) {
MAP[0][i] = 0 ;
MAP[i][0] = 0 ;
}
while ( 2 == scanf ( "%d%d", &column, &row ) ) {
if ( row == 0 && column == 0 ) break ;
de.clear() ;
for ( i = 1 ; i <= row ; i++ ) {
for ( j = 1 ; j <= column ; j++ ) {
scanf ( "%d", &MAP[i][j] ) ;
mark[i][j] = 0 ;
if ( MAP[i][j] == 2 ) {
temp.x = i ;
temp.y = j ;
temp.step = 0 ;
de.push_back(temp) ;
mark[i][j] = 6 ;
MAP[i][j] = 0 ;
}
}
}
for ( i = 1 ; i <= row+1 ; i++ )
MAP[i][column+1] = 0 ;
for ( i = 1 ; i <= column+1 ; i++ )
MAP[row+1][i] = 0 ;
p = 0 ;
BFS() ;
if ( !p ) printf ( "-1/n" ) ;
}
return 0 ;
}
void BFS()
{
while ( !de.empty() ) {
temp = de.front() ;
de.pop_front() ;
int life = mark[temp.x][temp.y]-1 ;
if ( life > mark[temp.x][temp.y+1]) {
if (judge(temp.x, temp.y+1, temp.step+1, life)) return ;
}
if ( life > mark[temp.x][temp.y-1]) {
if (judge(temp.x, temp.y-1, temp.step+1, life)) return ;
}
if ( life > mark[temp.x+1][temp.y]) {
if (judge(temp.x+1, temp.y, temp.step+1, life)) return ;
}
if ( life > mark[temp.x-1][temp.y]) {
if (judge(temp.x-1, temp.y, temp.step+1, life)) return ;
}
}
}
bool judge(int x, int y, int step, int life)
{
if ( MAP[x][y] == 3 ) {
p = 1 ;
printf ( "%d/n", step ) ;
return 1 ;
}
if ( MAP[x][y] != 0 ) {
t.x = x ;
t.y = y ;
t.step = step ;
de.push_back(t) ;
if ( MAP[x][y] == 1 ) {
mark[x][y] = life ;
}
else mark[x][y] = 6 ;
}
return 0 ;
}
ZOJ1217 : http://acm.zju.edu.cn/show_problem.php?pid=1217
/*
* 1.10s BFS
*/
#include <iostream>
#include <deque>
#include <string>
#include <set>
#include <map>
#include <algorithm>
using namespace std ;
#define aim 87654321
struct Node
{
int num ;
int pos ;
string step ;
}temp, t ;
deque<Node> de ;
int move[4][4] ;
set<int> mark ;
map<int,string> ans ;
bool initi()
{
int i, j, position ;
char x ;
for ( i = 0 ; i < 3 ; i ++ ) {
for ( j = 0 ; j < 3 ; j++ ) {
while ( 1 ) {
if ( EOF == scanf ( "%c", &x ) ) return false ;
if ( x == 'x' ) { move[i][j] = 0 ; break ; }
if ( x < '0' || x > '9' ) continue ;
move[i][j] = x-'0' ;
break ;
}
}
}
temp.num = 0 ;
for ( i = 2 ; i >= 0 ; i-- ) {
for ( j = 2 ; j >= 0 ; j-- ) {
temp.num = temp.num*10+move[i][j] ;
}
}
return true ;
}
int change()
{
int i, j, k = 0 ;
for ( i = 2 ; i >= 0 ; i-- ) {
for ( j = 2 ; j >= 0 ; j-- ) {
k = k*10 + move[i][j] ;
}
}
return k ;
}
void work()
{
int i, j ;
temp.num = 87654321 ; temp.pos = 8 ; temp.step = "" ;
de.push_back(temp) ;
mark.clear() ;
mark.insert(87654321) ;
while ( !de.empty() ) {
temp = de.front() ;
de.pop_front() ;
int x = temp.pos/3 ;
int y = temp.pos%3 ;
for ( i = 0 ; i < 3 ; i++ ) {
for ( j = 0 ; j < 3 ; j++ ) {
if ( x == i && y == j ) { temp.num /= 10 ; continue ; }
move[i][j] = temp.num%10 ;
temp.num /= 10 ;
}
}
int a = x, b = y, dig ;
a ++ ;
if ( a < 3 ) {
move[x][y] = move[a][b] ;
move[a][b] = 0 ;
dig = change() ;
if ( mark.find(dig) == mark.end() ) {
t.num = dig ;
t.pos = a*3+b ;
mark.insert(dig) ;
t.step = temp.step+'u' ;
ans[dig] = t.step ;
de.push_back(t) ;
}
move[a][b] = move[x][y] ;
}
a -= 2 ;
if ( a >= 0 ) {
move[x][y] = move[a][b] ;
move[a][b] = 0 ;
dig = change() ;
if ( mark.find(dig) == mark.end() ) {
t.num = dig ;
t.pos = a*3+b ;
mark.insert(dig) ;
t.step = temp.step+'d' ;
ans[dig] = t.step ;
de.push_back(t) ;
}
move[a][b] = move[x][y] ;
}
a ++ ; b ++ ;
if ( b < 3 ) {
move[x][y] = move[a][b] ;
move[a][b] = 0 ;
dig = change() ;
if ( mark.find(dig) == mark.end() ) {
t.num = dig ;
t.pos = a*3+b ;
mark.insert(dig) ;
t.step = temp.step+'l' ;
ans[dig] = t.step ;
de.push_back(t) ;
}
move[a][b] = move[x][y] ;
}
b -= 2 ;
if ( b >= 0 ) {
move[x][y] = move[a][b] ;
move[a][b] = 0 ;
dig = change() ;
if ( mark.find(dig) == mark.end() ) {
t.num = dig ;
t.pos = a*3+b ;
mark.insert(dig) ;
t.step = temp.step+'r' ;
ans[dig] = t.step ;
de.push_back(t) ;
}
move[a][b] = move[x][y] ;
}
}
}
int main ( void )
{
work() ;
while ( initi() ) {
if ( ans.find(temp.num) == ans.end() ) {
cout << "unsolvable" << endl ;
continue ;
}
reverse(ans[temp.num].begin(),ans[temp.num].end()) ;
cout << ans[temp.num] << endl ;
}
return 0 ;
}
ZOJ1505 : http://acm.zju.edu.cn/show_problem.php?pid=1505
/*
* 8.91s 7260K
* 单向BFS
*/
#include <iostream>
#include <set>
#include <deque>
using namespace std ;
struct Node
{
long long num ;
int step ;
}te, ben ;
deque<Node> de ;
set<long long> s ;
long long aim ;
struct Point
{
int x, y ;
}p[4] ;
bool BFS() ;
long long p_l() ;
void l_p(long long) ;
void Search() ;
int main ( void )
{
while ( EOF != scanf( "%d%d%d%d%d%d%d%d", &p[0].x, &p[0].y, &p[1].x, &p[1].y,
&p[2].x, &p[2].y, &p[3].x, &p[3].y ) ) {
Node temp ;
temp.num = p_l() ;
temp.step = 0 ;
s.clear() ; de.clear() ;
s.insert(temp.num) ;
de.push_back(temp) ;
scanf( "%d%d%d%d%d%d%d%d", &p[0].x, &p[0].y, &p[1].x, &p[1].y,
&p[2].x, &p[2].y, &p[3].x, &p[3].y ) ;
aim = p_l() ;
if ( BFS() ) printf ( "YES/n" ) ;
else printf ( "NO/n" ) ;
}
return 0 ;
}
bool BFS()
{
while ( !de.empty() ) {
te = de.front() ;
de.pop_front() ;
if ( te.num == aim ) return true ;
if ( te.step == 9 ) break ;
l_p(te.num) ;
Search() ;
}
return false ;
}
long long p_l()
{
int a, b, c, d ;
a = (p[0].x-1)*8+p[0].y ;
b = (p[1].x-1)*8+p[1].y ;
c = (p[2].x-1)*8+p[2].y ;
d = (p[3].x-1)*8+p[3].y ;
long long num = 0, x, i ;
x = 1 ;
x = x << (a-1) ;
num = num|x ;
x = 1 ;
x = x << (b-1) ;
num = num|x ;
x = 1 ;
x = x << (c-1) ;
num = num|x ;
x = 1 ;
x = x << (d-1) ;
num = num|x ;
return num ;
}
void l_p(long long x)
{
int bit, n = 0, k ;
for ( bit = 1 ; bit <= 64 ; bit++ ) {
if ( n == 4 ) break ;
if ( x&1 ) {
k = bit ;
p[n].y = k%8 ;
k /= 8 ;
p[n].x = k ;
if ( p[n].y == 0 ) p[n].y = 8 ;
else p[n].x ++ ;
n ++ ;
}
x = x >> 1 ;
}
}
void Search()
{
Point t ;
int i, j ;
long long num ;
for ( i = 0 ; i < 4 ; i++ ) {
t = p[i] ;
p[i].x -- ;
if ( p[i].x > 0 ) {
for ( j = 0 ; j < 4 ; j++ ) {
if ( j == i ) continue ;
if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;
}
if ( j == 4 ) {
num = p_l() ;
if ( s.find(num) == s.end() ) {
ben.num = num ;
ben.step = te.step +1 ;
de.push_back(ben) ;
s.insert(num) ;
}
}
else {
p[i].x -- ;
if ( p[i].x > 0 ) {
for ( j = 0 ; j < 4 ; j++ ) {
if ( j == i ) continue ;
if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;
}
if ( j == 4 ) {
num = p_l() ;
if ( s.find(num) == s.end() ) {
ben.num = num ;
ben.step = te.step +1 ;
de.push_back(ben) ;
s.insert(num) ;
}
}
}
}
}
p[i] = t ;
p[i].y -- ;
if ( p[i].y > 0 ) {
for ( j = 0 ; j < 4 ; j++ ) {
if ( j == i ) continue ;
if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;
}
if ( j == 4 ) {
num = p_l() ;
if ( s.find(num) == s.end() ) {
ben.num = num ;
ben.step = te.step +1 ;
de.push_back(ben) ;
s.insert(num) ;
}
}
else {
p[i].y -- ;
if ( p[i].y > 0 ) {
for ( j = 0 ; j < 4 ; j++ ) {
if ( j == i ) continue ;
if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;
}
if ( j == 4 ) {
num = p_l() ;
if ( s.find(num) == s.end() ) {
ben.num = num ;
ben.step = te.step +1 ;
de.push_back(ben) ;
s.insert(num) ;
}
}
}
}
}
p[i] = t ;
p[i].x ++ ;
if ( p[i].x < 9 ) {
for ( j = 0 ; j < 4 ; j++ ) {
if ( j == i ) continue ;
if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;
}
if ( j == 4 ) {
num = p_l() ;
if ( s.find(num) == s.end() ) {
ben.num = num ;
ben.step = te.step +1 ;
de.push_back(ben) ;
s.insert(num) ;
}
}
else {
p[i].x ++ ;
if ( p[i].x < 9 ) {
for ( j = 0 ; j < 4 ; j++ ) {
if ( j == i ) continue ;
if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;
}
if ( j == 4 ) {
num = p_l() ;
if ( s.find(num) == s.end() ) {
ben.num = num ;
ben.step = te.step +1 ;
de.push_back(ben) ;
s.insert(num) ;
}
}
}
}
}
p[i] = t ;
p[i].y ++ ;
if ( p[i].y < 9 ) {
for ( j = 0 ; j < 4 ; j++ ) {
if ( j == i ) continue ;
if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;
}
if ( j == 4 ) {
num = p_l() ;
if ( s.find(num) == s.end() ) {
ben.num = num ;
ben.step = te.step +1 ;
de.push_back(ben) ;
s.insert(num) ;
}
}
else {
p[i].y ++ ;
if ( p[i].y < 9 ) {
for ( j = 0 ; j < 4 ; j++ ) {
if ( j == i ) continue ;
if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;
}
if ( j == 4 ) {
num = p_l() ;
if ( s.find(num) == s.end() ) {
ben.num = num ;
ben.step = te.step +1 ;
de.push_back(ben) ;
s.insert(num) ;
}
}
}
}
}
p[i] = t ;
}
}