
标签:src sele unique ica horizon load ast space play
2
2 3
516
思路:暴搜,O(16*2^16)
AC代码:
#include <iostream> #include<cstdio> #include<map> using namespace std; int x,a,b; int ans=0; int board[10][10]; int black,white; map<pair<int,int>,int> mp; int get_loc(int x,int y) {return 4*(x-1)+y;} bool check(int p){ for(int i=1;i<=4;i++){ for(int j=1;j<=4;j++){ if(i<=2&&board[i][j]==p&&board[i+1][j]==p&&board[i+2][j]==p) return 1; if(j<=2&&board[i][j]==p&&board[i][j+1]==p&&board[i][j+2]==p) return 1; if(i<=2&&j<=2&&board[i][j]==p&&board[i+1][j+1]==p&&board[i+2][j+2]==p) return 1; if(i<=2&&j>=3&&board[i][j]==p&&board[i+1][j-1]==p&&board[i+2][j-2]==p) return 1; } } return 0; } void dfs(int x,int y,int turn){ board[x][y]=turn; int cop1=black,cop2=white; black=black|((turn==2)<<(get_loc(x,y)-1)); white=white|((turn==3)<<(get_loc(x,y)-1)); if(check(2)){ board[x][y]=0,black=cop1,white=cop2; return; } if(check(3)){ if(x==a&&y==b) ans++; board[x][y]=0,black=cop1,white=cop2; return; } if(mp[make_pair(black,white)]){//判重必需在以上两个check之后 board[x][y]=0,black=cop1,white=cop2; return; } mp[make_pair(black,white)]=1; for(int j=1;j<=4;j++){ for(int i=1;i<=4;i++){ if(!board[i][j]&&(i==1||(i>=2&&board[i-1][j]))){ dfs(i,j,turn^1); } } } board[x][y]=0,black=cop1,white=cop2; } int main() { scanf("%d%d%d",&x,&a,&b); dfs(1,x,2); printf("%d\n",ans); return 0; }
标签:src sele unique ica horizon load ast space play
原文地址:https://www.cnblogs.com/lllxq/p/9744544.html