HDU 3004 the chess

http://acm.hdu.edu.cn/showproblem.php?pid=3004

这是一道象棋题假设你有JU MA PAO的前提下,对方的棋局不能动,你只能用这个三颗棋子,在最短的时间楼内杀死对方的帅,和1732 差不多,8维hash判重。。。。对于JU 和pao 可以确定一个方向搜到底。。只不多 这里很BT的是要考虑蹩脚MA啊。。。

代码:

#include<iostream> #include<queue> using namespace std ; char map[15][15] ; int n,m ; int dx[] = {0,-1,0,1} ; int dy[] = {-1,0,1,0} ; int Mx[] = {2,2,-2,-2,1,1,-1,-1} ; int My[] = {1,-1,1,-1,2,-2,2,-2} ; int mx[] = {1,1,-1,-1,0,0, 0, 0} ; int my[] = {0,0, 0, 0,1,-1,1,-1} ; bool hash[11][11][11][11][11][11] ; struct Node { int x,y; }; struct state { Node c,m,p; int st; }start,cur,next ; queue<state>q ; bool logic(int x,int y) { if(x>=0&&x<n&&y>=0&&y<n) return true ; return false ; } void set(state cur) { hash[cur.c.x][cur.c.y][cur.m.x][cur.m.y][cur.p.x][cur.p.y] = true ; } bool get(state cur) { return hash[cur.c.x][cur.c.y][cur.m.x][cur.m.y][cur.p.x][cur.p.y] ; } int bfs() { while(!q.empty()) { cur = q.front() ; q.pop() ; map[cur.c.x][cur.c.y]='C',map[cur.m.x][cur.m.y]='M',map[cur.p.x][cur.p.y]='P' ; for(int i=0;i<4;i++) { next = cur ; next.c.x += dx[i] ; next.c.y += dy[i] ; next.st ++ ; while(logic(next.c.x,next.c.y)&&map[next.c.x][next.c.y]=='.') { if(!get(next)) { set(next); q.push(next) ; } next.c.x += dx[i] ; next.c.y += dy[i] ; } if(map[next.c.x][next.c.y]=='S') { return next.st ; } } for(int i=0;i<8;i++) { next = cur ; next.m.x += Mx[i] ; next.m.y += My[i] ; next.st ++ ; int x = cur.m.x + mx[i] ; int y = cur.m.y + my[i] ; if(logic(next.m.x,next.m.y)&&map[x][y]=='.') { if(map[next.m.x][next.m.y]=='S') return next.st ; else if(map[next.m.x][next.m.y]=='.') { if(!get(next)) { set(next) ; q.push(next); } } } } for(int i=0;i<4;i++) { next = cur ; next.p.x += dx[i] ; next.p.y += dy[i] ; next.st ++ ; while(logic(next.p.x,next.p.y)&&map[next.p.x][next.p.y]=='.') { if(!get(next)) { set(next) ; q.push(next) ; } next.p.x += dx[i] ; next.p.y += dy[i] ; } if(next.p.x>=0&&next.p.x<n&&next.p.y>=0&&next.p.y<n&&map[next.p.x][next.p.y]!='S') { next.p.x += dx[i] ; next.p.y += dy[i] ; while(logic(next.p.x,next.p.y)&&map[next.p.x][next.p.y]=='.') { next.p.x += dx[i] ; next.p.y += dy[i] ; } if(next.p.x>=0&&next.p.x<n&&next.p.y>=0&&next.p.y<n&&map[next.p.x][next.p.y]=='S') return next.st ; } } map[cur.c.x][cur.c.y]='.',map[cur.m.x][cur.m.y]='.',map[cur.p.x][cur.p.y]='.' ; } return -1; } int main() { int cas = 0 ; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) { scanf("%s",&map[i]); for(int j=0;j<n;j++) { if(map[i][j]=='C') start.c.x = i , start.c.y = j , map[i][j] = '.' ; else if(map[i][j]=='M') start.m.x = i , start.m.y = j , map[i][j] = '.' ; else if(map[i][j]=='P') start.p.x = i , start.p.y = j , map[i][j] = '.' ; } } start.st = 0 ; memset(hash,false,sizeof(hash)); hash[start.c.x][start.c.y][start.m.x][start.m.y][start.p.x][start.p.y] = true ; while(!q.empty()) q.pop() ; q.push(start); int ans = bfs(); printf("Scenario #%d/n",++cas); if(ans!=-1) printf("%d/n",ans); else printf("OH!That's impossible!/n"); printf("/n"); } return 0 ; }

你可能感兴趣的:(c,struct,ini,BT)