poj 1681

来源:互联网 发布:.com域名注册备案 编辑:程序博客网 时间:2024/05/16 17:00

   题目意思很简单,很poj 1222其实是一模一样的,只是要会判断是否存在无解的情况。当用高斯法化简了矩阵以后,再答案矩阵的那部分若有值不为0,则无解(具体原来可以见czyuan神的blog或者去看看线性代数的相关内容)。若有解,求出解矩阵以后数出其中1的个数即为答案。

     以下是详细代码:

 

 

  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(){
  2. 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;}

原创粉丝点击