P1225
题目
题目描述:
黑白棋游戏的棋盘由 4×4 方格阵列构成。棋盘的每一方格中放有 1 枚棋子,共有 8 枚白棋子和 8 枚黑棋子。这 16 枚棋子的每一种放置方案都构成一个游戏状态。在棋盘上拥有 1 条公共边的 2 个方格称为相邻方格。一个方格最多可有 4 个相邻方格。在玩黑白棋游戏时,每一步可将任何 2 个相邻方格中棋子互换位置。对于给定的初始游戏状态和目标游戏状态,编程计算从初始游戏状态变化到目标游戏状态的最短着棋序列。
输入格式:
输入文件共有 8 行。前四行是初始游戏状态,后四行是目标游戏状态。每行 4 个数分别表示该行放置的棋子颜色。“ 0 ”表示白棋;“ 1 ”表示黑棋。
输出格式:
输出文件的第一行是着棋步数 n。接下来 n 行,每行 4 个数分别表示该步交换棋子的两个相邻方格的位置。例如,abcd 表示将棋盘上 (a,b) 处的棋子与 (c,d) 处的棋子换位。
数据范围与说明:
由 @zhouyonglong 提供 SPJ
输入输出样例 #1
输入:
1 2 3 4 5 6 7 8
| 1111 0000 1110 0010 1010 0101 1010 0101
|
输出:
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include<bits/stdc++.h> using namespace std; int f[5005][5005],len=1; void func(int x){ for(int i=1;i<=len;i++){ f[x][i]=f[x-1][i]+f[x-2][i]; } for(int i=1;i<=len;i++){ if(f[x][i]>=10){ f[x][i+1]+=f[x][i]/10; f[x][i]%=10; while(f[x][len+1]){ len++; } } } } int main(){ int n; cin>>n; f[1][1]=1; f[2][1]=2; for(int i=3;i<=n;i++){ func(i); } for(int i=len;i>=1;i--){ cout<<f[n][i]; } return 0; }
|