本文共 1807 字,大约阅读时间需要 6 分钟。
题意:有四种翻转方式,问是否能使得所有棋子都变为0,求最小步数。
题解:依次构造枚举求出最小值即可。
#include #include #include #include #include #include #include #include #include using namespace std;const int inf=0x3f3f3f;const int maxn=300;//有equ个方程,var个变元。增广矩阵行数为equ,列数为var+1,分别为0到varint equ,var;int a[maxn][maxn]; //增广矩阵int x[maxn]; //解集int free_x[maxn];//用来存储自由变元(多解枚举自由变元可以使用)int free_num;//自由变元的个数//返回值为-1表示无解,为0是唯一解,否则返回自由变元个数int gauss(){ int max_r,col,k; free_num=0; for(k=0,col=0; k abs(a[max_r][col])) max_r=i; if(!a[max_r][col]) { k--; free_x[free_num++]=col; continue; } if(max_r!=k) for(int j=col; j =0; i--) { x[i]=a[i][var]; for(int j=i+1; j 0) a[(i-1)*m+j][t]=1; //上 if(i<(n-1)) a[(i+1)*m+j][t]=1; //下 if(j>0) a[i*m+j-1][t]=1; //左 if(j<(m-1)) a[i*m+j+1][t]=1; //右 }}void init2(){ memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); equ=n*m; var=n*m; for(int i=0; i 0) a[(i-1)*m+j][t]=1; //上 //if(i 0) a[i*m+j-1][t]=1; //左 if(j<(m-1)) a[i*m+j+1][t]=1; //右 if(i>0&&j>0) a[(i-1)*m+j-1][t]=1; //左上 //if(i>0&&j<(m-1)) a[(i-1)*m+j+1][t]=1; //右上 if(i 0) a[(i+1)*m+j-1][t]=1; //左下 //if(i 0) a[(i-1)*m+j][t]=1; //上 if(i<(n-1)) a[(i+1)*m+j][t]=1; //下 if(j>0) a[i*m+j-1][t]=1; //左 if(j<(m-1)) a[i*m+j+1][t]=1; //右 //if(i>0&&j>0) a[(i-1)*m+j-1][t]=1; //左上 if(i>0&&j 0) a[(i+1)*m+j-1][t]=1; //左下 //if(i 0) a[(i-1)*m+j][t]=1; //上 if(i<(n-1)) a[(i+1)*m+j][t]=1; //下 if(j>0) a[i*m+j-1][t]=1; //左 //if(j 0&&j>0) a[(i-1)*m+j-1][t]=1; //左上 if(i>0&&j 0) a[(i+1)*m+j-1][t]=1; //左下 if(i<(n-1)&&j<(m-1)) a[(i+1)*m+j+1][t]=1; //右下 }}int solve(){ int t=gauss(); if(t==-1) { return inf; } else if(t==0) { int ans=0; for(int i=0; i =0; j--) { int idx; for(idx=j; idx >data[i]; init1(); for(int i=0; i
转载于:https://www.cnblogs.com/Ritchie/p/5866247.html