题目描述 Description
在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻的空格,这叫行棋一步,黑白双方交替走棋,任意一方可以先走,如果某个时刻使得任意一种颜色的棋子形成四个一线(包括斜线),这样的状态为目标棋局。
● | ○ | ● | |
○ | ● | ○ | ● |
● | ○ | ● | ○ |
○ | ● | ○ |
输入描述 Input Description
从文件中读入一个4*4的初始棋局,黑棋子用B表示,白棋子用W表示,空格地带用O表示。
输出描述 Output Description
用最少的步数移动到目标棋局的步数。
样例输入 Sample Input
BWBO
WBWB
BWBW
WBWO
样例输出 Sample Output
5
注意这是CODEVS,洛谷用这个代码会WA两个点(我也不知道为什么)。
这里给出一位大佬的代码(看懂看不懂我不管,反正我不懂):http://www.cnblogs.com/J-william/p/6443754.html
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1}; 5 int ans,flag,ox1,oy1,ox2,oy2; 6 int chess[5][5]; 7 bool can()//判断是否满足同种颜色在一行||列||对角线 8 { 9 for(int i=1;i<=4;i++)//判断行是否相同 10 { 11 int ok=1; 12 for(int j=1;j<=3;j++) 13 if(chess[i][j]!=chess[i][j+1])ok=0; 14 if(ok)return 1; 15 } 16 for(int i=1;i<=4;i++)//判断列是否相同 17 { 18 int ok=1; 19 for(int j=1;j<=3;j++) 20 if(chess[j][i]!=chess[j+1][i])ok=0; 21 if(ok)return 1; 22 } 23 if(chess[1][1]==chess[2][2] && chess[2][2]==chess[3][3] && chess[3][3]==chess[4][4])return 1;//判断对角线是否相同 24 if(chess[1][4]==chess[2][3] && chess[2][3]==chess[3][2] && chess[3][2]==chess[4][1])return 1; 25 return 0; 26 } 27 void dfs(int x,int y,int n,int m,int up,int step) 28 { 29 if(can()) 30 { 31 flag=1; 32 return; 33 } 34 else if(step>ans)return; 35 int xx,yy,nn,mm; 36 for(int i=1;i<=4;i++) 37 { 38 xx=x+dx[i],yy=y+dy[i]; 39 mm=m+dy[i],nn=n+dx[i]; 40 if(chess[xx][yy]!=up && xx>=1 && xx<=4 && yy>=1 && yy<=4) 41 //不出棋盘,枚举到的棋子与当前棋子不相同 42 { 43 swap(chess[xx][yy],chess[x][y]); 44 dfs(xx,yy,n,m,chess[x][y],step+1); 45 swap(chess[xx][yy],chess[x][y]);//回溯 46 } 47 if(chess[nn][mm]!=up && mm>=1 && mm<=4 && nn>=1 && nn<=4) 48 { 49 swap(chess[nn][mm],chess[n][m]); 50 dfs(x,y,nn,mm,chess[n][m],step+1); 51 swap(chess[nn][mm],chess[n][m]); 52 } 53 } 54 } 55 int main() 56 { 57 for(int i=1;i<=4;i++) 58 { 59 char s[12]; 60 cin>>s; 61 for(int j=1;j<=4;j++)//将字符转换成数字存储 62 { 63 if(s[j-1]==‘B‘)chess[i][j]=1; 64 else if(s[j-1]==‘W‘)chess[i][j]=2; 65 else 66 { 67 if(!ox1)ox1=i,oy1=j;//找到第一个空格 68 else ox2=i,oy2=j; 69 chess[i][j]=3; 70 } 71 } 72 } 73 for(ans=0;;ans++) 74 { 75 dfs(ox1,oy1,ox2,oy2,1,1); 76 dfs(ox1,oy1,ox2,oy2,2,1); 77 if(flag) 78 { 79 cout<<ans; 80 break; 81 } 82 } 83 return 0; 84 }
时间: 2024-10-14 20:44:14