八数码问题增强版
Posted wzx-rs-sthn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八数码问题增强版相关的知识,希望对你有一定的参考价值。
Description
三行三列的数组,其元素值为0至8的数。现有如下的变换规则:
1: 将0与上面一行元素对换
2:将0与下面一行元素对换
3:将0与左面一行元素对换
4:将0与右面一行元素对换
如果已知一个三行三列元素的初始情况,问最少需几次变换,能变换为指定的一种情况?
1: 将0与上面一行元素对换
2:将0与下面一行元素对换
3:将0与左面一行元素对换
4:将0与右面一行元素对换
如果已知一个三行三列元素的初始情况,问最少需几次变换,能变换为指定的一种情况?
Input
包括六行的数据,每行有三个以空格分隔的数字。 前三行为原始状态 后三行为目标状态
Output
若能在20次以内(包括20)变换得到目标状态的数组,输出最少的变换次数;
若不能在20次以内(包括20)变换得到目标状态的数组,输出No solution!
若不能在20次以内(包括20)变换得到目标状态的数组,输出No solution!
Sample Input
0 4 8
2 6 3
1 7 5
0 2 3
1 8 4
7 6 5
Sample Output
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; }
以上是关于八数码问题增强版的主要内容,如果未能解决你的问题,请参考以下文章