2014年网络赛题
先说下题意 告诉你起点 终点 n*n的地图 地图是由空 满 有一个标号的钥匙 蛇组成 问能不能到达终点
你只有拿到n一下的所有钥匙才能拿到n这把钥匙 (比如现在要拿表号位5的钥匙 你必须有1 2 3 4的钥匙 如果没有 但也能走这个格子) 但能走所有非满的格子 蛇只能杀一次
#include#include #include #include using namespace std ; struct node { int x ,y ,step ,key ; int kill ; }a ,b ; int mark [110 ][110 ][10 ][50 ],n ,m ,Min ,flash ;//mark记录状态 char map [110 ][110 ]; int dir [4 ][2 ]={0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0 }; int bfs (int starx ,int stary ) { a .x =starx ; a .y =stary ; a .step =0 ; a .key =0 ; a .kill =0 ; memset (mark ,127 ,sizeof(mark )); mark [a .x ][a .y ][a .key ][a .kill ]=0 ; queue <node >q ; q .push (a ); while(!q .empty ()) { b =q .front (); q .pop (); if(map [b .x ][b .y ]=='T' &&b .key ==m ) { if(b .step <Min ) Min =b .step ; flash =1 ; continue; } for(int i =0 ;i <4 ;i ++) { a .x =b .x +dir [i ][0 ]; a .y =b .y +dir [i ][1 ]; a .step =b .step +1 ; a .key =b .key ; a .kill =b .kill ; if(a .x <0 ||a .x >=n ||a .y <0 ||a .y >=n ) continue; if(map [a .x ][a .y ]=='#' ) continue; /*if(mark[a.x][a.y][a.key][a.kill]) continue; { if(a.step>mark[a.x][a.y][a.key][a.kill]) continue; }*/ if(map [a .x ][a .y ]>='a' &&map [a .x ][a .y ]<='z' ) { int t =map [a .x ][a .y ]-'a' ; if((a .kill &(1 <<t ))==0 ) { a .kill =a .kill |(1 <<t ); a .step ++; } //mark[a.x][a.y][a.key][a.kill]=a.step; //q.push(a); } else if(map [a .x ][a .y ]>='1' &&map [a .x ][a .y ]<='9' ) { int x =map [a .x ][a .y ]-'0' ; if(a .key ==x -1 ) a .key =x ; //mark[a.x][a.y][a.key][a.kill]=a.step; //if(a.step<=mark[a.x][a.y][a.key][a.kill]) q.push(a); } else { //mark[a.x][a.y][a.key][a.kill]=a.step; //q.push(a); } if(a .step <mark [a .x ][a .y ][a .key ][a .kill ]) { mark [a .x ][a .y ][a .key ][a .kill ]=a .step ; q .push (a ); } } } return 0 ; } int main() { int i ,j ; while(~scanf ("%d%d" ,&n ,&m ),n +m ) { for(i =0 ;i <n ;i ++) scanf ("%s" ,map [i ]); char t ='a' ; int starx ,stary ,endx ,endy ; for(i =0 ;i <n ;i ++) { for(j =0 ;j <n ;j ++) { if(map [i ][j ]=='K' ) { starx =i ; stary =j ; } else if(map [i ][j ]=='S' ) { map [i ][j ]=t ++; } else if(map [i ][j ]=='T' ) { endx =i ; endy =j ; } } } Min =999999 ; flash =0 ; bfs (starx ,stary ); if(!flash ) printf ("impossible\n" ); else printf ("%d\n" ,Min ); } return 0 ; }