三行三列的数组,其元素值为0至8的数。现有如下的变换规则:
1: 将0与上面一行元素对换
2:将0与下面一行元素对换
3:将0与左面一行元素对换
4:将0与右面一行元素对换
如果已知一个三行三列元素的初始情况,问最少需几次变换,能变换为指定的一种情况?
标签:NPU script sample solution oid i++ put 学业 cout
0 4 8
2 6 3
1 7 5
0 2 3
1 8 4
7 6 5
10
学业问题下周完善
#include<bits/stdc++.h> int ans[4][4],a[4][4],flag,k; int bx[4]={0,1,-1,0}; int by[4]={1,0,0,-1}; using namespace std; int check() { for(int i=1;i<=3;++i) for(int j=1;j<=3;++j) if(ans[i][j]!=a[i][j])return 0; return 1; } int test(int step) { int t=0; for(int i=1;i<=3;++i) for(int j=1;j<=3;++j) if(ans[i][j]!=a[i][j]) { if(++t+step>k) return 0;} return 1; } void A_star(int step,int x,int y,int pre) { if(step==k){ if(check())flag=1; return;} if(flag) return; if(step>k)return; if(step>20)return; for(int i=0;i<4;++i) { int nx=x+bx[i],ny=y+by[i]; if(nx<1||nx>3||ny<1||ny>3||pre+i==3) continue; swap(a[x][y],a[nx][ny]); if(test(step)&&!flag) A_star(step+1,nx,ny,i); swap(a[x][y],a[nx][ny]); } } int main() { int x,y; for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) { cin>>a[i][j]; if(a[i][j]==0) x=i,y=j; } for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) cin>>ans[i][j]; if(check()){cout<<0;return 0;} while(++k) { A_star(0,x,y,-1); if(k>20){cout<<"No solution!";return 0;} if(flag){cout<<k;break;} } return 0; }
标签:NPU script sample solution oid i++ put 学业 cout
原文地址:https://www.cnblogs.com/wzx-RS-STHN/p/12945681.html