[C] 纯文本查看 复制代码 #include<bits/stdc++.h>
using namespace std;
int a[3][3]={//座位表
6,7,-1,
3,4,5,
1,2,-1
};
int f[3][3]={//标记
0,0,-1,
0,0,0,
0,0,-1
};
struct student{
int x1,y1;//原来位置
int x2,y2;//调整后位置
int num;//学号
}stu[8];
int cnt;//计数
bool check(int n,int x,int y)//检查n号同学调换到xy后 是否与原同桌不在同一行
{
for(int i=1;i<=7;i++){//检查其他同学
if((stu[n].x1==stu[i].x1)&&(x==stu[i].x2)){//原行数相同 调整后行数相同
return false;
}
}
return true;
}
void dfs(int n)
{
for(int i=0;i<3;i++){ //位置遍历
for(int j=0;j<3;j++){
if((f[i][j]==0) && a[i][j]!=n && check(n,i,j)){ //位置未标记 不是原位置 不同行
f[i][j]=n;//标记
stu[n].x2=i;
stu[n].y2=j;//记录新坐标
if(n==7){//七个人排完了
for(int k=0;k<3;k++){//打印输出
for(int l=0;l<3;l++){
if(f[k][l]>0)
cout<<f[k][l]<<" ";
}
cout<<endl;
}
cout<<endl;
cnt++;
}
else{
dfs(n+1);
}
f[i][j]=0;//回溯
stu[n].x2=-1;
stu[n].y2=-1;
}
}
}
}
int main()
{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(a[i][j]>0){
stu[a[i][j]].x1=i;//原位置
stu[a[i][j]].y1=j;
stu[a[i][j]].x2=-1;//调整后位置
stu[a[i][j]].y2=-1;
}
}
}
dfs(1);
cout<<cnt;
return 0;
}
|