1. 程式人生 > 其它 >leetcode1728 貓和老鼠II

leetcode1728 貓和老鼠II

思路:

博弈dp。

實現:

 1 int dp[8][8][8][8][1001];
 2 class Solution {
 3 public:
 4     const int dx[4]={1,0,-1,0};
 5     const int dy[4]={0,1,0,-1};
 6     bool dfs(int cx,int cy,int mx,int my,int fx,int fy,int cs,int ms,int cur,vector<string>&a){
 7         if(cur==1000){
 8             return false;
9 } 10 int n=a.size(),m=a[0].length(); 11 if(dp[cx][cy][mx][my][cur]!=-1){ 12 return dp[cx][cy][mx][my][cur]; 13 } 14 if(cur&1){//cat's turn 15 if(cx==mx and cy==my)return true; 16 if(cx==fx and cy==fy)return true; 17 if
(mx==fx and my==fy)return false; 18 bool res=false; 19 if(!dfs(cx,cy,mx,my,fx,fy,cs,ms,cur+1,a)){ 20 res=true; 21 } 22 else{ 23 for(int d=0;d<4;d++){ 24 int cnx=cx,cny=cy; 25 for(int
s=1;s<=cs;s++){ 26 cnx+=dx[d]; 27 cny+=dy[d]; 28 if(cnx<0 or cnx>=n or cny<0 or cny>=m or a[cnx][cny]=='#'){ 29 break; 30 } 31 if(!dfs(cnx,cny,mx,my,fx,fy,cs,ms,cur+1,a)){ 32 res=true;break; 33 } 34 } 35 if(res)break; 36 } 37 } 38 return dp[cx][cy][mx][my][cur]=res; 39 } 40 else{//mouse's turn 41 if(cx==mx and cy==my)return false; 42 if(mx==fx and my==fy)return true; 43 if(cx==fx and cy==fy)return false; 44 bool res=false; 45 if(!dfs(cx,cy,mx,my,fx,fy,cs,ms,cur+1,a)){ 46 res=true; 47 } 48 else{ 49 for(int d=0;d<4;d++){ 50 int mnx=mx,mny=my; 51 for(int s=1;s<=ms;s++){ 52 mnx+=dx[d]; 53 mny+=dy[d]; 54 if(mnx<0 or mnx>=n or mny<0 or mny>=m or a[mnx][mny]=='#'){ 55 break; 56 } 57 if(!dfs(cx,cy,mnx,mny,fx,fy,cs,ms,cur+1,a)){ 58 res=true;break; 59 } 60 } 61 if(res)break; 62 } 63 } 64 return dp[cx][cy][mx][my][cur]=res; 65 } 66 } 67 bool canMouseWin(vector<string>&a, int x, int y) { 68 int n=a.size(),m=a[0].size(); 69 for(int i=0;i<n;i++){ 70 for(int j=0;j<m;j++){ 71 for(int k=0;k<n;k++){ 72 for(int l=0;l<m;l++){ 73 for(int p=0;p<=1000;p++){ 74 dp[i][j][k][l][p]=-1; 75 } 76 } 77 } 78 } 79 } 80 int cx=-1,cy=-1,mx=-1,my=-1,fx=-1,fy=-1; 81 for(int i=0;i<n;i++){ 82 for(int j=0;j<m;j++){ 83 if(a[i][j]=='C'){ 84 cx=i;cy=j; 85 } 86 else if(a[i][j]=='M'){ 87 mx=i;my=j; 88 } 89 else if(a[i][j]=='F'){ 90 fx=i;fy=j; 91 } 92 } 93 } 94 return dfs(cx,cy,mx,my,fx,fy,x,y,0,a); 95 } 96 };