HDU-1401 Solitaire 搜索
来源:互联网 发布:博客系统源码 编辑:程序博客网 时间:2024/05/17 19:57
http://acm.hdu.edu.cn/showproblem.php?pid=1401
题意:8*8的棋盘 固定4个棋子 问能否在8步以内(包括8步)从一个状态移动到另个状态 移动的时候如果所移动的位置也是棋子 可以直接跳过 (类似跳棋)
暴力搜索 8维数组表示状态恶心的要死 QAQ MLE 压入栈的时候加了个条件后AC
#include <stdio.h>#include <string.h>#include <queue>using namespace std;const int maxn = 8;bool vis[maxn][maxn][maxn][maxn][maxn][maxn][maxn][maxn];int xs[] = {0,1,0,-1};int ys[] = {1,0,-1,0};char map[maxn][maxn];struct node{ int x[4],y[4]; int step;};int getDis( int x1,int y1,node aim ){int ans = 0;for( int i = 0; i < 4; i ++ )ans += abs( x1-aim.x[i] ) + abs( y1-aim.y[i] );return ans;}void setMap( node x ){for( int i = 0; i < 4; i ++ )map[x.x[i]][x.y[i]] = '@';}void mark( node cnt,int m ){ vis[cnt.x[0]][cnt.y[0]][cnt.x[1]][cnt.y[1]][cnt.x[2]][cnt.y[2]][cnt.x[3]][cnt.y[3]] = m; vis[cnt.x[0]][cnt.y[0]][cnt.x[1]][cnt.y[1]][cnt.x[3]][cnt.y[3]][cnt.x[2]][cnt.y[2]] = m; vis[cnt.x[0]][cnt.y[0]][cnt.x[2]][cnt.y[2]][cnt.x[1]][cnt.y[1]][cnt.x[3]][cnt.y[3]] = m; vis[cnt.x[0]][cnt.y[0]][cnt.x[2]][cnt.y[2]][cnt.x[3]][cnt.y[3]][cnt.x[1]][cnt.y[1]] = m; vis[cnt.x[0]][cnt.y[0]][cnt.x[3]][cnt.y[3]][cnt.x[1]][cnt.y[1]][cnt.x[2]][cnt.y[2]] = m; vis[cnt.x[0]][cnt.y[0]][cnt.x[3]][cnt.y[3]][cnt.x[2]][cnt.y[2]][cnt.x[1]][cnt.y[1]] = m; vis[cnt.x[1]][cnt.y[1]][cnt.x[0]][cnt.y[0]][cnt.x[2]][cnt.y[2]][cnt.x[3]][cnt.y[3]] = m; vis[cnt.x[1]][cnt.y[1]][cnt.x[0]][cnt.y[0]][cnt.x[3]][cnt.y[3]][cnt.x[2]][cnt.y[2]] = m; vis[cnt.x[1]][cnt.y[1]][cnt.x[2]][cnt.y[2]][cnt.x[0]][cnt.y[0]][cnt.x[3]][cnt.y[3]] = m; vis[cnt.x[1]][cnt.y[1]][cnt.x[2]][cnt.y[2]][cnt.x[3]][cnt.y[3]][cnt.x[0]][cnt.y[0]] = m; vis[cnt.x[1]][cnt.y[1]][cnt.x[3]][cnt.y[3]][cnt.x[0]][cnt.y[0]][cnt.x[2]][cnt.y[2]] = m; vis[cnt.x[1]][cnt.y[1]][cnt.x[3]][cnt.y[3]][cnt.x[2]][cnt.y[2]][cnt.x[0]][cnt.y[0]] = m; vis[cnt.x[2]][cnt.y[2]][cnt.x[0]][cnt.y[0]][cnt.x[1]][cnt.y[1]][cnt.x[3]][cnt.y[3]] = m; vis[cnt.x[2]][cnt.y[2]][cnt.x[0]][cnt.y[0]][cnt.x[3]][cnt.y[3]][cnt.x[1]][cnt.y[1]] = m; vis[cnt.x[2]][cnt.y[2]][cnt.x[1]][cnt.y[1]][cnt.x[0]][cnt.y[0]][cnt.x[3]][cnt.y[3]] = m; vis[cnt.x[2]][cnt.y[2]][cnt.x[1]][cnt.y[1]][cnt.x[3]][cnt.y[3]][cnt.x[0]][cnt.y[0]] = m; vis[cnt.x[2]][cnt.y[2]][cnt.x[3]][cnt.y[3]][cnt.x[0]][cnt.y[0]][cnt.x[1]][cnt.y[1]] = m; vis[cnt.x[2]][cnt.y[2]][cnt.x[3]][cnt.y[3]][cnt.x[1]][cnt.y[1]][cnt.x[0]][cnt.y[0]] = m; vis[cnt.x[3]][cnt.y[3]][cnt.x[0]][cnt.y[0]][cnt.x[1]][cnt.y[1]][cnt.x[2]][cnt.y[2]] = m; vis[cnt.x[3]][cnt.y[3]][cnt.x[0]][cnt.y[0]][cnt.x[2]][cnt.y[2]][cnt.x[1]][cnt.y[1]] = m; vis[cnt.x[3]][cnt.y[3]][cnt.x[1]][cnt.y[1]][cnt.x[0]][cnt.y[0]][cnt.x[2]][cnt.y[2]] = m; vis[cnt.x[3]][cnt.y[3]][cnt.x[1]][cnt.y[1]][cnt.x[2]][cnt.y[2]][cnt.x[0]][cnt.y[0]] = m; vis[cnt.x[3]][cnt.y[3]][cnt.x[2]][cnt.y[2]][cnt.x[0]][cnt.y[0]][cnt.x[1]][cnt.y[1]] = m; vis[cnt.x[3]][cnt.y[3]][cnt.x[2]][cnt.y[2]][cnt.x[1]][cnt.y[1]][cnt.x[0]][cnt.y[0]] = m;}bool BFS( node start,node aim ){ node cur,cnt; memset( vis,0,sizeof(vis) );memset( map,' ',sizeof(map) );setMap( aim ); mark(aim,2); start.step = 0; queue<node>que; que.push(start); while( !que.empty() ){ cur = que.front(); que.pop(); if( cur.step >= 8 ) return false; for( int k = 0; k < 4; k ++ ){ for( int i = 0; i < 4; i ++ ){ cnt = cur; cnt.x[k] = cur.x[k] + xs[i]; cnt.y[k] = cur.y[k] + ys[i]; if( cnt.x[k] >= 0 && cnt.x[k] < maxn && cnt.y[k] >= 0 && cnt.y[k] < maxn ){ if( (cnt.x[k] == cur.x[0] && cnt.y[k] == cur.y[0])|| (cnt.x[k] == cur.x[1] && cnt.y[k] == cur.y[1]) || (cnt.x[k] == cur.x[2] && cnt.y[k] == cur.y[2]) || (cnt.x[k] == cur.x[3] && cnt.y[k] == cur.y[3]) ){ cnt.x[k] += xs[i]; cnt.y[k] += ys[i]; if( !( cnt.x[k] >= 0 && cnt.x[k] < maxn && cnt.y[k] >= 0 && cnt.y[k] < maxn ) ) continue; if( (cnt.x[k] == cur.x[0] && cnt.y[k] == cur.y[0])|| (cnt.x[k] == cur.x[1] && cnt.y[k] == cur.y[1]) || (cnt.x[k] == cur.x[2] && cnt.y[k] == cur.y[2]) || (cnt.x[k] == cur.x[3] && cnt.y[k] == cur.y[3]) ) continue; }int l; for( l = 0; l < 4; l ++ )if( map[cnt.x[l]][cnt.y[l]] != '@' )break;if( l == 4 )return true; if( !vis[cnt.x[0]][cnt.y[0]][cnt.x[1]][cnt.y[1]][cnt.x[2]][cnt.y[2]][cnt.x[3]][cnt.y[3]] ){ mark(cnt,1); cnt.step = cur.step + 1;if( getDis( cnt.x[k],cnt.y[k],aim ) - getDis( cur.x[k],cur.y[k],aim ) <= 2 ) //注意que.push(cnt); } } } } } return 0;}int main(){ //freopen("data.txt","r",stdin); node start,aim; while( scanf("%d%d",&start.x[0],&start.y[0] ) == 2 ){start.x[0] --; start.y[0] --;for( int i = 1; i < 4; i ++ ){scanf("%d%d",&start.x[i],&start.y[i] );start.x[i] --; start.y[i] --;} for( int i = 0; i < 4; i ++ ){scanf("%d%d",&aim.x[i],&aim.y[i]);aim.x[i] --; aim.y[i] --;} if( BFS( start,aim ) ) puts("YES"); else puts("NO"); } return 0;}
- HDU-1401 Solitaire 搜索
- HDU 1401 Solitaire(双向搜索)
- poj 1198 hdu 1401 搜索+剪枝 Solitaire
- HDU 1401 Solitaire (双向搜索)
- HDU 1401 Solitaire(双向广度优先搜索)
- hdu 1401 Solitaire(bfs)
- HDU 1401 Solitaire
- HDU 1401 Solitaire 双向BFS
- hdu 1401 Solitaire 双向bfs
- HDU 1401 Solitaire 双向BFS
- HDU 1401 Solitaire(bfs)
- HDU 1401 Solitaire [双向BFS]
- HDU 1401 Solitaire(双向BFS)
- hdu 1401 Solitaire(双向bfs)
- HDU 1401 Solitaire(棋盘状态BFS)
- HDU 1401 Solitaire (双向广搜)
- hdu 1401/poj 1198 Solitaire(BFS,剪枝)
- hdu 1401 Solitaire(双向宽搜)
- 中科院算法试题 陈玉福
- VHDL基础
- 认识 wine
- Unity3D 4.3新特性 —— 动画
- Linux下如何实现U盘、SD卡自动挂载功能?
- HDU-1401 Solitaire 搜索
- 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
- ssh 连接oracle hibernate配置
- shell find 语法
- Android开发之AsyncTask的使用
- 黑马程序员:注解(Annotation)介绍
- MySql插入数据时错误Duplicate entry '131' for key 'PRIMARY'
- [ java ] tomcat中server.xml中虚拟主机配置
- 从C#与Net4高级编程复制来的——委托注意事项