题目意思很简单,很poj 1222其实是一模一样的,只是要会判断是否存在无解的情况。当用高斯法化简了矩阵以后,再答案矩阵的那部分若有值不为0,则无解(具体原来可以见czyuan神的blog或者去看看线性代数的相关内容)。若有解,求出解矩阵以后数出其中1的个数即为答案。
以下是详细代码:
-
#include "stdio.h" #include "string.h" #include "math.h" const int N=300; const int M=300; char array[N][N]; int matrix[M][M],ans[M]; int dir[4][2]={-1,0,1,0,0,-1,0,1}; int n,m; bool check(int x,int y) { if(x>=0 && x<m && y>=0 && y<m) return true; else return false; } void solve() { int i,j,k,temp; int row=0,col=0,a,b; int cnt=0; while(row<n && col<n) { int id=row; for(i=row+1;i<n;i++) if(fabs(matrix[i][col])>fabs(matrix[id][col])) id=i; if(matrix[id][col]) { temp=matrix[id][col]; for(i=col;i<=n;i++) { k=matrix[id][i]; matrix[id][i]=matrix[row][i]; matrix[row][i]=k; } for(i=row+1;i<n;i++) if(matrix[i][col]) { for(j=col;j<=n;j++) matrix[i][j]^=matrix[row][j]; } row++; } col++; } for(i=row;i<n;i++) if(matrix[i][n]) { printf("inf/n"); return ; } cnt=matrix[n-1][n]; for(i=n-2;i>=0;i--) { for(j=i+1;j<n;j++) matrix[i][n]^=(matrix[i][j] && matrix[j][n]); cnt+=matrix[i][n]; } printf("%d/n",cnt); } int main() {
-
int t; scanf("%d",&t); while(t--) { int i,j,k; int x,y,a,b; scanf("%d",&m);getchar(); n=m*m; memset(matrix,0,sizeof(matrix)); for(i=0;i<m;i++) scanf("%s",array[i]); for(i=0;i<m;i++) { for(j=0;j<m;j++) { a=i*m+j; if(array[i][j]!='y') matrix[a][n]=1; matrix[a][a]=1; for(k=0;k<4;k++) { x=i+dir[k][0]; y=j+dir[k][1]; if(check(x,y)) { b=x*m+y; matrix[a][b]=1; } } } } solve(); } return 0; }