hdu3004 The Chess
来源:互联网 发布:mac听写功能不能用 编辑:程序博客网 时间:2024/06/10 22:56
一道广搜题。。用六维hash判重即可,要注意一下马的别脚和炮的隔山打牛。。。稍微细心点敲就应该不会错。。。随后附上部分有针对性的生成数据,仅供参考(答案自己去算)
附代码如下
# include <iostream># include <queue>using namespace std;const int size = 11;struct node{ int mx, my; int px, py; int cx, cy; int step; };int n, m;int sx, sy;bool hash[size][size][size][size][size][size];node start, next, pre;const int GoM[8][2] = {{1, 2}, {1, -2}, {-1, 2}, {-1, -2}, {2, 1}, {2, -1}, {-2, 1}, {-2, -1}};const int GoM1[8][2] = {{0, 1}, {0, -1}, {0, 1}, {0, -1}, {1, 0}, {1, 0}, {-1, 0}, {-1, 0}};const int GoC[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};char mapp[size][size];int ans;bool check(int x, int y){ return (x >= 0 && x < n && y >= 0 && y < m); }/*void pri(node a){ for (int i = 0; i < n; i ++){ for (int j = 0; j < m; j ++){ if (i == a.mx && j == a.my)cout<<"M"; else if (i == a.cx && j == a.cy)cout<<"C"; else if (i == a.px && j == a.py)cout<<"P"; else if (mapp[i][j] == 'D')cout<<"D"; else if (mapp[i][j] == 'S')cout<<"S"; else cout<<'.'; } cout<<endl; } }*/void bfs(){ memset(hash, false, sizeof(hash)); start.step = 0; queue <node> Que; Que.push(start); hash[start.mx][start.my][start.px][start.py][start.cx][start.cy] = true; while (!Que.empty()){ node pre = Que.front(); Que.pop(); //pri(pre); //cout<<pre.px<<' '<<pre.py<<endl; for (int i = 0; i < 8; i ++){//m int xx = pre.mx + GoM[i][0]; int yy = pre.my + GoM[i][1]; int judx = pre.mx + GoM1[i][0]; int judy = pre.my + GoM1[i][1];// if (!check(xx, yy) )continue; if ((judx == pre.px && judy == pre.py) || (judx == pre.cx && judy == pre.cy)||mapp[judx][judy] == 'D' || mapp[judx][judy] == 'S')continue; if ((xx == pre.px && yy == pre.py) || (xx == pre.cx && yy == pre.cy) || mapp[xx][yy] == 'D')continue; //cout<<"xx:"<<xx<<' '<<"yy:"<<yy<<' '<<"judx:"<<judx<<' '<<"judy:"<<judy<<' '<<mapp[xx][yy]<<endl; if (!hash[xx][yy][pre.px][pre.py][pre.cx][pre.cy]){ if (mapp[xx][yy] == 'S'){ //if (ans < pre.step) ans = pre.step+1; //pri(pre); return ; } hash[xx][yy][pre.px][pre.py][pre.cx][pre.cy] = true; next = pre; next.mx = xx, next.my = yy; next.step ++; Que.push(next); } } for (int i = 0; i < 4; i ++){//c for (int k = 1; k <= 10; k ++){ //cout<<"adsasd"<<endl; int xx = pre.cx + k*GoC[i][0]; int yy = pre.cy + k*GoC[i][1]; if (!check(xx, yy) || (pre.mx == xx && pre.my == yy) || (pre.px == xx && pre.py == yy) || mapp[xx][yy] == 'D')break; if (!hash[pre.mx][pre.my][pre.px][pre.py][xx][yy]){ if (mapp[xx][yy] == 'S'){ ans = pre.step+1; return ; } hash[pre.mx][pre.my][pre.px][pre.py][xx][yy] = true; next = pre; next.cx = xx, next.cy = yy; next.step ++; Que.push(next); } } } for (int i = 0; i < 4; i ++){//p int flag = 0; for (int k = 1; k <= 10; k ++){ int xx = pre.px + k*GoC[i][0]; int yy = pre.py + k*GoC[i][1];// if (!check(xx, yy))break; if ((pre.mx == xx && pre.my == yy) || (pre.cx == xx && pre.cy == yy) || mapp[xx][yy] == 'D' || mapp[xx][yy] == 'S')flag ++; if (flag == 1 && mapp[xx][yy] == 'S')break; if (flag == 1 )continue; if (flag > 2 )break;// //cout<<"flag:"<<flag<<endl; if (flag == 2 && mapp[xx][yy] != 'S')break;//cout<<"xx:"<<xx<<' '<<"yy:"<<yy<<' '<<flag<<' '<<mapp[xx][yy]<<endl; //if (mapp[xx][yy] == 'S') if (!hash[pre.mx][pre.my][xx][yy][pre.cx][pre.cy]){ if (mapp[xx][yy] == 'S'){ ans = pre.step+1; //pri(pre); return ; } hash[pre.mx][pre.my][xx][yy][pre.cx][pre.cy] = true; next = pre; next.px = xx, next.py = yy; next.step ++; Que.push(next); } } } } //pri(pre);}int main(){ //freopen("IN.txt", "r", stdin); //freopen("OUT.txt", "w", stdout); int nc = 0; while (scanf("%d%d", &n, &m) != EOF){ for (int i = 0; i < n; i ++){ scanf("%s", mapp[i]); for (int j = 0; j < m; j ++){ if (mapp[i][j] == 'M'){ start.mx = i, start.my = j; mapp[i][j] = '.'; } if (mapp[i][j] == 'C'){ start.cx = i, start.cy = j; mapp[i][j] = '.'; } if (mapp[i][j] == 'P'){ start.px = i, start.py = j; mapp[i][j] = '.'; } } } ans = -1; printf("Scenario #%d\n", ++nc); bfs(); if (ans == -1)printf("OH!That's impossible!\n\n"); else printf("%d\n\n", ans); } return 0 ;}/*5 5P.DDS...DD ...CD..M.......5 5....S...MD...DC......P...5 5C.DDSP..D. ...D...DM......7 9PCD....S.DD....... ......D.......DMD.......D....................5 5P.DDS..... .......DMD....C8 10D.......CDMDDD.........D......D..D...D...DD.DD.DD.D.D...DD.DDDD......D..DDP..DDS4 10...DD......P.......DD..DDC...D.MDDSD....4 6...D......D.CM...S..DP.D*/
- hdu3004 The Chess
- HDU 3004 the chess
- HDU3004解题报告【模拟题】
- chess
- Chess
- chess
- chess
- Chess
- Chess
- Chess
- chess
- Chess
- Chess
- EightQueens in the game of chess
- HDU 3004 the chess 【bfs模拟】
- 极大极小过程 UVA 10838 - The Pawn Chess
- hdu 3004 The Chess【广独优先搜索】
- List all the position that two kings not encounter in Chinese chess
- Oracle 一个数据库如何在不同端口上监听
- Nios II 中的DMA
- new delete运算符
- 初始引导时/dev/console /dev/ram0来历
- How Tomcat Works学习笔记<一>
- hdu3004 The Chess
- MySQL5.5(免安装版)的配置及UTF8设置
- C/C++内存管理(随笔)
- poj 2029 Get Many Persimmon Trees 二维树状数组
- 远程操控系统中键盘和鼠标事件操控的小结
- poj 2354 || URAL 1030 Titanic
- Redhat MysqlReport安装配置详解
- 虚函数和纯虚函数
- 关于VC多字节字符集和unicode宽字符集的使用和问题,只有明白了其中的原理,才能灵活解决问题