题目:移动字母
2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着。如图【1.jpg】所示。
和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和E就可以移动,移动后的局面分别是:
A B
D E C
A B C
D E
为了表示方便,我们把6个格子中字母配置用一个串表示出来,比如上边的两种局面分别表示为:
AB*DEC
ABCD*E
题目的要求是:请编写程序,由用户输入若干表示局面的串,程序通过计算,输出是否能通过对初始状态经过若干次移动到达该状态。可以实现输出1,否则输出0。初始状态为:ABCDE*
用户输入的格式是:先是一个整数n,表示接下来有n行状态。程序输出也应该是n行1或0
例如,用户输入:
3
ABCDE*
AB*DEC
CAED*B
则程序应该输出:
1
1
0
注意:
请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。
请把所有函数写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
源代码中不能能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。
第三届蓝桥杯部分试题与答案
2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着。如图【1.jpg】所示。
和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和E就可以移动,移动后的局面分别是:
A B
D E C
A B C
D E
为了表示方便,我们把6个格子中字母配置用一个串表示出来,比如上边的两种局面分别表示为:
AB*DEC
ABCD*E
题目的要求是:请编写程序,由用户输入若干表示局面的串,程序通过计算,输出是否能通过对初始状态经过若干次移动到达该状态。可以实现输出1,否则输出0。初始状态为:ABCDE*
用户输入的格式是:先是一个整数n,表示接下来有n行状态。程序输出也应该是n行1或0
例如,用户输入:
3
ABCDE*
AB*DEC
CAED*B
则程序应该输出:
1
1
0
注意:
请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。
请把所有函数写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。
源代码中不能能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。
(本题28分)
C++代码:
#include <iostream>
#include <cstring>
using namespace std;
int vis[6];//用于标记路径是否走过
int TF[100],count;//用于保存每个字符串结果
char temp[]="ABCDE*";//要比较的字符串
void swap(char *a,char *b) { //交换位置
char T = *a;
*a = *b;
*b = T;
}
void fun(char *cur,int row,int column) {//递归求解
int i,x,y;
int a[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//前后左右移动
if(!strcmp(cur,temp)) {
TF[count] = 1;
return;
}
else {
for(i = 0; i < 4; i++) {//每次空格可以前后左右移动
x = row + a[i][0];
y = column + a[i][1];
if((x >= 0 && x <= 1) && (y >= 0 && y <= 2) && !vis[3 * x + y]) {//如果存在此点且未被访问
swap(cur + 3 * row + column,cur + 3 * x + y);
vis[3 * x + y] = 1;
fun(cur,x,y);
swap(cur + 3 * row + column,cur + 3 * x + y);//要恢复原来状态,避免影响后面运算
vis[3 * x + y] = 0;
}
}
}
}
int main() {
int n,row,column,i;
char array[7];
cin >> n;
i = n;
while (i--) {
cin >> array;
for (int i = 0; i < 6; i++) {
if (array[i] == '*') {
row = i-3 < 0 ? 0 : 1;
column = i%3;
}
}
fun(array,row,column);
count++;
}
for(int i = 0; i < n; i++)
cout << TF[i] << endl;
return 0;
}
第三届蓝桥杯部分试题与答案