示例#1
0
文件: matsolve.c 项目: FairSky/ggnfs
int main(int argC, char *args[])
/****************************************************/
{ char       colName[64], depName[64], str[1024];
  double     startTime, stopTime;
  s32       *deps, origC;
  u32        seed=DEFAULT_SEED;
  long       testMode=0;
  struct stat fileInfo;
  nfs_sparse_mat_t M;
  llist_t    C;
  int        i;
  FILE      *fp, *ifp;

  strcpy(colName, DEFAULT_COLNAME);
  strcpy(depName, DEFAULT_DEPNAME);
  printf(START_MSG, GGNFS_VERSION);
  seed=time(0);
  /* This probably shouldn't be needed, but whatever. */
  seed = ((seed % 1001)*seed) ^ (171*seed);

  for (i=1; i<argC; i++) {
    if (strcmp(args[i], "-v")==0) {
      verbose++;
    } else if (strcmp(args[i], "-seed")==0) {
      if ((++i) < argC) {
        seed = atol(args[i]);
      }
    } else if (strcmp(args[i], "-save")==0) {
      if ((++i) < argC) {
        matsave_interval = 60 * atoi(args[i]);
      }
    } else if (strcmp(args[i], "-test")==0) {
      testMode = 1;
    } else if (strcmp(args[i], "--help")==0) {
      printf("USAGE: %s %s\n", args[0], USAGE);
      exit(0);
    }
  }
  srand(seed);
  if (stat("depinf", &fileInfo)) {
    printf("Could not stat depinf! Are you trying to run %s to soon?\n", args[0]);
    return -1;
  }
  seedBlockLanczos(seed);
  startTime = sTime();
  msgLog("", "GGNFS-%s : matsolve (seed=%" PRIu32 ")", GGNFS_VERSION, seed);
  printf("Using PRNG seed=%" PRIu32 ".\n", seed);

  readSparseMat(&M, "spmat");
  ll_read(&C, "sp-index");
  printf("Verifying column map..."); fflush(stdout);
  ll_verify(&C);
  printf("done.\n");


  printf("Matrix loaded: it is %" PRId32 " x %" PRId32 ".\n", M.numRows, M.numCols);
  if (M.numCols < (M.numRows + 64)) {
    printf("More columns needed (current = %" PRId32 ", min = %" PRId32 ")\n",
           M.numCols, M.numRows+64);
    free(M.cEntry); free(M.cIndex);
    exit(-1);
  }
  if (checkMat(&M, delCols, &numDel)) {
    printf("checkMat() returned some error! Terminating...\n");
    exit(-1);
  }

  /* We need to know how many columns there were in the original, unpruned
     matrix, so we know how much memory to allocate for the dependencies.
  */
  if (!(ifp = fopen("depinf", "rb"))) {
    fprintf(stderr, "Error opening depinf for read!\n");
    exit(-1);
  }
  readBinField(str, 1024, ifp);
  while (!(feof(ifp)) && strncmp(str, "END_HEADER",10)) {
    if (strncmp(str, "NUMCOLS: ", 9)==0) {
      sscanf(&str[9], "%" SCNx32, &origC);
    }
    readBinField(str, 1024, ifp);
  }
  fclose(ifp); 
  printf("Original matrix had %" PRId32 " columns.\n", origC);

  if (!(deps = (s32 *)malloc(origC*sizeof(s32)))) {
    printf("Could not allocate %" PRIu32 " bytes for the dependencies.\n", (u32)(origC*sizeof(s32)) );
    free(M.cEntry); free(M.cIndex); return -1;
  }

  if (getDependencies(&M, &C, deps, origC, testMode) == 0) {
    if (!(ifp = fopen("depinf", "rb"))) {
      fprintf(stderr, "Error opening depinf for read!\n");
      exit(-1);
    }
    printf("Writing dependencies to file %s.\n", depName);
    if (!(fp = fopen(depName, "wb"))) {
      fprintf(stderr, "Error opening %s for write!\n", depName);
      fclose(ifp);
    } else {
      /* Get the header information from depinf. */
      readBinField(str, 1024, ifp);
      while (!(feof(ifp)) && strncmp(str, "END_HEADER",10)) {
        writeBinField(fp, str);
        readBinField(str,1024,ifp);
      }
      if (strncmp(str, "END_HEADER",10)) {
        fprintf(stderr, "Error: depinf is corrupt!\n");
        fclose(ifp); fclose(fp); exit(-1);
      }
      writeBinField(fp, str);
      fclose(ifp);
      fwrite(deps, sizeof(s32), origC, fp);
      fclose(fp);
    }
  }

  stopTime = sTime();
  printf("Total elapsed time: %1.2lf seconds.\n", stopTime-startTime);
  msgLog("", "Heap stats for matsolve run:");
  logHeapStats();



  free(M.cEntry); free(M.cIndex); free(deps);
  return 0;
}  
示例#2
0
文件: query.c 项目: wedmonster/pbear
int main(int argc, char** args){
    PetscErrorCode err;
    PetscViewer fd = NULL;
    Mat invL1 = NULL, invU1 = NULL, invL2 = NULL, invU2 = NULL, H12 = NULL, H21 = NULL;
    Vec order = NULL, r = NULL; //, or = NULL; //dimension: n: n1 + n2
    Vec seeds = NULL;
    //    Vec r1 = NULL, q1 = NULL, t1_1 = NULL, t1_2 = NULL, t1_3 = NULL, t1_4 = NULL, t1_5 = NULL; // dimension: n1
    //    Vec r2 = NULL, q2 = NULL, q_tilda = NULL, t2_1 = NULL, t2_2 = NULL, t2_3 = NULL; // dimension: n2
    PetscRandom rand;

    PetscLogDouble tic, toc, total_time, time;
    PetscInt n, i;
    PetscMPIInt rank, size;
    PetscInt seed;
    PetscScalar c, val;
    PetscInt QN = 100;

    // Initialize PETSC and MPI
    err = PetscInitialize(&argc, &args, (char*) 0, help); CHKERRQ(err);
    err = MPI_Comm_size(PETSC_COMM_WORLD, &size); CHKERRQ(err);
    err = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(err);
    err = PetscPrintf(PETSC_COMM_WORLD, "mpi size: %d\n", size); CHKERRQ(err); 

    // Read matrices and an ordering vector
    err = PetscPrintf(PETSC_COMM_WORLD, "Read inputs (invL1, invU1, invL2, invU2, H12, H21, order)\n"); CHKERRQ(err);

    err = loadMat("./data/invL1.dat", &invL1, PETSC_COMM_WORLD, MATMPIAIJ, &fd); CHKERRQ(err);
    err = checkMat("invL1", invL1); CHKERRQ(err);

    err = loadMat("./data/invU1.dat", &invU1, PETSC_COMM_WORLD, MATMPIAIJ, &fd); CHKERRQ(err);
    err = checkMat("invU1", invU1); CHKERRQ(err);

    err = loadMat("./data/invL2.dat", &invL2, PETSC_COMM_WORLD, MATMPIAIJ, &fd); CHKERRQ(err);
    err = checkMat("invL2", invL2); CHKERRQ(err);

    err = loadMat("./data/invU2.dat", &invU2, PETSC_COMM_WORLD, MATMPIAIJ, &fd); CHKERRQ(err);
    err = checkMat("invU2", invU2); CHKERRQ(err);

    err = loadMat("./data/H12.dat", &H12, PETSC_COMM_WORLD, MATMPIAIJ, &fd); CHKERRQ(err);
    err = checkMat("H12", H12); CHKERRQ(err);

    err = loadMat("./data/H21.dat", &H21, PETSC_COMM_WORLD, MATMPIAIJ, &fd); CHKERRQ(err);
    err = checkMat("H21", H21); CHKERRQ(err);

    err = loadVec("./data/order.dat", &order, PETSC_COMM_SELF, &fd); CHKERRQ(err); //all processes must have this vector for ordering the result vector.
    err = checkVec("order", order); CHKERRQ(err);

    // shift -1 for zero-based index
    err = VecShift(order, -1); CHKERRQ(err);
    err = VecGetSize(order, &n); CHKERRQ(err);

    seed = 5;
    c = 0.05;
    err = PetscTime(&tic); CHKERRQ(err);

    //err = BearQueryMat(seed, c, invL1, invU1, invL2, invU2, H12, H21, order); CHKERRQ(err);
    //err = PetscTime(&toc); CHKERRQ(err);
    //time = toc - tic;
    //err = PetscPrintf(PETSC_COMM_WORLD, "running time: %f sec\n", time); CHKERRQ(err);

    ///* 100 times querying
    err = VecCreateSeq(PETSC_COMM_SELF, QN, &seeds); CHKERRQ(err);
    err = VecSetFromOptions(seeds); CHKERRQ(err); 
    err = PetscRandomCreate(PETSC_COMM_WORLD, &rand); CHKERRQ(err);
    err = PetscRandomSetSeed(rand, 100); CHKERRQ(err);
    err = PetscRandomSetInterval(rand, (PetscScalar) 0, (PetscScalar) n); CHKERRQ(err);
    err = PetscRandomSetFromOptions(rand); CHKERRQ(err);
    err = VecSetRandom(seeds, rand); CHKERRQ(err);
    err = PetscRandomDestroy(&rand); CHKERRQ(err);

    seed = 5; //seed is give by user on one-based index
    c = 0.05;

    i = 0;

    err = VecDuplicate(order, &r); CHKERRQ(err);
    for(i = 0; i < QN; i++){
        err = VecGetValues(seeds, 1, &i, &val);
        seed = (PetscInt) val;
        //err = PetscPrintf(PETSC_COMM_SELF, "rank: %d, seed: %d\n", rank, seed);
        err = PetscTime(&tic); CHKERRQ(err);
        err = BearQuery(seed, c, invL1, invU1, invL2, invU2, H12, H21, order, r); CHKERRQ(err);
        err = PetscTime(&toc); CHKERRQ(err);
        time = toc - tic;
        err = PetscPrintf(PETSC_COMM_WORLD, "running time: %f sec\n", time); CHKERRQ(err);
        total_time += time;
    }
    err = PetscPrintf(PETSC_COMM_WORLD, "average running time: %f sec\n", total_time/QN); CHKERRQ(err);
    err = VecDestroy(&r);


    /*    err = MatGetSize(H12, &n1, &n2); CHKERRQ(err);
          n = n1 + n2;
          err = PetscPrintf(PETSC_COMM_WORLD, "n1: %d, n2: %d\n", n1, n2); CHKERRQ(err);

          err = VecCreateMPI(PETSC_COMM_WORLD, PETSC_DECIDE, n, &r); CHKERRQ(err);
          err = VecCreateMPI(PETSC_COMM_WORLD, PETSC_DECIDE, n1, &q1); CHKERRQ(err);
          err = VecCreateMPI(PETSC_COMM_WORLD, PETSC_DECIDE, n2, &q2); CHKERRQ(err);
          err = VecSet(q1, 0); CHKERRQ(err);
          err = VecSet(q2, 0); CHKERRQ(err);

          seed = seed - 1; // shift -1 for zero-based index
          err = VecGetValues(order, 1, &seed, &val); CHKERRQ(err);
          oseed = (PetscInt) val;
          err = PetscPrintf(PETSC_COMM_WORLD, "Given seed: %d, Reorered seed: %d (0 ~ n-1)\n", seed, oseed); CHKERRQ(err);

          if(oseed < n1){
          err = VecSetValues(q1, 1, &oseed, &one, INSERT_VALUES); CHKERRQ(err);
          }else{
          oseed = oseed - n1;
          err = VecSetValues(q2, 1, &oseed, &one, INSERT_VALUES); CHKERRQ(err);
    //err = printVecSum(q2);
    }
    err = VecAssemblyBegin(q1); CHKERRQ(err);
    err = VecAssemblyBegin(q2); CHKERRQ(err);
    err = VecAssemblyEnd(q1); CHKERRQ(err);
    err = VecAssemblyEnd(q2); CHKERRQ(err);

    err = VecDuplicate(q1, &r1); CHKERRQ(err);
    err = VecDuplicate(q1, &t1_1); CHKERRQ(err);
    err = VecDuplicate(q1, &t1_2); CHKERRQ(err);
    err = VecDuplicate(q1, &t1_3); CHKERRQ(err);
    err = VecDuplicate(q1, &t1_4); CHKERRQ(err);
    err = VecDuplicate(q1, &t1_5); CHKERRQ(err);

    err = VecDuplicate(q2, &r2); CHKERRQ(err);
    err = VecDuplicate(q2, &q_tilda); CHKERRQ(err);
    err = VecDuplicate(q2, &t2_1); CHKERRQ(err);
    err = VecDuplicate(q2, &t2_2); CHKERRQ(err);
    err = VecDuplicate(q2, &t2_3); CHKERRQ(err);

    // Start matrix-vec multiplications
    err = MatMult(invL1, q1, t1_1); CHKERRQ(err);
    err = MatMult(invU1, t1_1, t1_2); CHKERRQ(err);
    err = MatMult(H21, t1_2, t2_1); CHKERRQ(err);
    err = VecAXPBYPCZ(q_tilda, 1.0, -1.0, 0.0, q2, t2_1); CHKERRQ(err);
    err = MatMult(invL2, q_tilda, t2_2); CHKERRQ(err);
    err = MatMult(invU2, t2_2, r2); CHKERRQ(err);

    err = MatMult(H12, r2, t1_3); CHKERRQ(err);
    err = VecAXPBYPCZ(t1_4, 1.0, -1.0, 0.0, q1, t1_3); CHKERRQ(err);
    err = MatMult(invL1, t1_4, t1_5); CHKERRQ(err);
    err = MatMult(invU1, t1_5, r1); CHKERRQ(err);
    //err = printVecSum(r1); 

    //err = VecView(r2, PETSC_VIEWER_STDOUT_WORLD);

    // Concatenate r1 and r2
    err = VecMerge(r1, r2, r); CHKERRQ(err);
    err = VecScale(r, c); CHKERRQ(err);

    //err = VecView(r, PETSC_VIEWER_STDOUT_WORLD);

    err = VecDuplicate(r, &or); CHKERRQ(err);
    err = VecReorder(r, order, or); CHKERRQ(err);
    //err = VecView(or, PETSC_VIEWER_STDOUT_WORLD);*/

    // Destory matrices and vectors
    err = MatDestroy(&invL1); CHKERRQ(err);
    err = MatDestroy(&invU1); CHKERRQ(err);
    err = MatDestroy(&invL2); CHKERRQ(err);
    err = MatDestroy(&invU2); CHKERRQ(err);
    err = MatDestroy(&H12); CHKERRQ(err);
    err = MatDestroy(&H21); CHKERRQ(err);
    err = VecDestroy(&order); CHKERRQ(err);
    err = VecDestroy(&r); CHKERRQ(err);
    err = VecDestroy(&seeds); CHKERRQ(err);
    //err = VecDestroy(&or); CHKERRQ(err);

    /*    err = VecDestroy(&r1); CHKERRQ(err);
          err = VecDestroy(&q1); CHKERRQ(err);
          err = VecDestroy(&t1_1); CHKERRQ(err);
          err = VecDestroy(&t1_2); CHKERRQ(err);
          err = VecDestroy(&t1_3); CHKERRQ(err);
          err = VecDestroy(&t1_4); CHKERRQ(err);
          err = VecDestroy(&t1_5); CHKERRQ(err);

          err = VecDestroy(&r2); CHKERRQ(err);
          err = VecDestroy(&q2); CHKERRQ(err);
          err = VecDestroy(&q_tilda); CHKERRQ(err);
          err = VecDestroy(&t2_1); CHKERRQ(err);
          err = VecDestroy(&t2_2); CHKERRQ(err);
          err = VecDestroy(&t2_3); CHKERRQ(err);*/

    // Finalize
    err = PetscFinalize(); CHKERRQ(err);
    return 0;
}
示例#3
0
/* main function */
int main ( int argc , char * argv[] ) {
	int **del;
	long c1, c2, c3;
	int err, atDelay, atDelay2;
	double corr, corr2, corr_nd, corr2_nd;
	/* parsing input params */
	char *inputFile, *maskFile, *fout1;;
	inputFile = argv[1]; 
	fout1 = argv[2];

	// Because this program is written in such a hurry, HARDCODING!
	int goodValues = 28146;

	fprintf(stderr, "Allocating some memory... ");	
	double *inputArray;
	inputArray = (double*)calloc(goodValues*goodValues, sizeof(double));
	double **out;
        out = (double**)calloc(goodValues,sizeof(double*));
	for(int i = 0; i < goodValues; i++ ) out[i] = (double*)calloc(goodValues,sizeof(double));
	fprintf(stderr, "...DONE!\n");	

	fprintf(stderr, "Reading data ...  ");	
	FILE * file;
	file = fopen( inputFile , "r" );
	double d;
	for ( int i = 0 ; i < goodValues*goodValues ; i++ ) {
        	fscanf( file, "%lf", &d );
		inputArray[i] = d;
	}
	fprintf(stderr, "...DONE!\n");	
	
	fprintf(stderr, "**performing 2d matrix transfer ... \n");
	#pragma omp parallel for
	for ( int i = 0 ; i < goodValues ; i++ ) {
		for ( int j = 0 ; j < goodValues ; j++ ) {
			out[i][j] = inputArray[i*goodValues+j];
			if (out[i][j] != out[i][j]) out[i][j]=0.0;
			if (out[i][j] > 1.0 ) out[i][j]=1.0;
			if (out[i][j] < -1.0 ) out[i][j]=-1.0;
		}
	}
	fprintf(stderr, "done!**\n");
	free(inputArray);

	// Checking matrix integrety before saving
	fprintf(stderr, "Checking matrix integrity before saving ... \n");
	checkMat( out , goodValues );
	fprintf(stderr, "done!**\n");

	fprintf(stderr, "**saving output...");
	FILE *output;
	output = fopen( fout1, "w" ); 
	fprintf( output, "%i \n", goodValues );	
	for(int i = 0 ; i < goodValues ; i++ ) {
		for(int j = i ; j < goodValues ; j++ ) {
			fprintf(output, "%lf \n", out[i][j]);	
		}
	} 
	fprintf(stderr, "done!**\n"); 
	for(int i=0;i<goodValues;i++)free(out[i]);
	free(out);
	fclose(output);
	return 0;
}
bool ensureMat(cv::Mat& mat, int depth,int channels,cv::Size size){
	if(checkMat(mat,depth,channels,size)) return true;
	mat = cv::Mat(size, CV_MAKETYPE(depth,channels));
	return !mat.empty();
}
int main(int argc,char* argv[]){
	skl::OptParser options;
	std::vector<std::string> args;
	opt_parse(options,argc,argv,args);

	if(options.help()){
		options.usage();
		return EXIT_FAILURE;
	}

	skl::VideoCapture cam;
	skl::VideoCaptureParams params;

	if(!camera_setting.empty()){
		params.load(camera_setting);
	}
	// CAUTION: call opt_parse_cap_prop after opt_parse
	opt_parse_cap_prop(params);



	if(input_file.empty()){
		cam.open(CV_CAP_OPENNI + dev);
//		cam.set(skl::OPENNI_IMAGE_GENERATOR,true);
//		cam.set(skl::OPENNI_DEPTH_GENERATOR,true);
	}
	else{
		cam.open(input_file);
	}

	// CAUTION: set params after open the camera.
	cam.set(params);

//	std::cout << "Camera Parameter Settings" << std::endl;
//	std::cout << cam.get();

	if(!cam.isOpened()){
		std::cerr << "ERROR: failed to open video." << std::endl;
		std::cerr << "       Maybe, camera is not connected to the PC??" << std::endl;
		return EXIT_FAILURE;
	}

	cv::namedWindow("image",0);
	cv::namedWindow("depth",0);
	cv::namedWindow("valid depth mask",0);
	cv::Mat image, depth, valid_depth_mask;


	while('q'!=cv::waitKey(10) && cam.grab()){
		cam.retrieve(depth,CV_CAP_OPENNI_DEPTH_MAP) ;
		assert(checkMat(depth,CV_16U,1));
		cam.retrieve(image,CV_CAP_OPENNI_BGR_IMAGE) ;
		assert(checkMat(image,CV_8U,3,depth.size()));
		cam.retrieve(valid_depth_mask,CV_CAP_OPENNI_VALID_DEPTH_MASK);
		assert(checkMat(valid_depth_mask,CV_8U,1,depth.size()));

		cv::imshow("image",image);
		cv::imshow("depth",depth);
		cv::imshow("valid depth mask",valid_depth_mask);
	}
	cv::destroyWindow("image");
	cv::destroyWindow("depth");
	cv::destroyWindow("valid depth mask");
	return EXIT_SUCCESS;
}
示例#6
0
void rec(int M1[5][5], int M2[5][5], int i, int j)
{int I,J;
z++;
if(z>3000)
{
	//printf("\nzzzzzzzzzzz\n");
	int flag=1,r=0,c=0,ii,jj,f=0,k,p=pc;
	//display(aa);
	for(k=0;k<25;k++){
		if(aa[aai[k]][aaj[k]]/10==p)
		{	r=aai[k];c=aaj[k]; ////printf("\ntrap : %d %d\n",r,c);
		break;}
	}
	
	
if((aa[0][0]/10==0 && aa[0][1]/10==3-p && aa[1][0]/10==3-p))
		{
			r=0;c=0;	//printf("\ntrap1 : %d %d\n",r,c);
		}
		else if((aa[0][4]/10==0 && aa[0][3]/10==3-p && aa[1][4]/10==3-p))
		{
			r=0;c=4;
		}
		else if((aa[4][0]/10==0 && aa[4][1]/10==3-p && aa[3][0]/10==3-p))
		{
			r=4;c=0;
		}
		else if((aa[4][4]/10==0 && aa[3][4]/10==3-p && aa[4][3]/10==3-p))
		{
			r=4;c=4;
		}
		else if(aa[0][0]==0)
		{r=0;c=0;		//printf("\ntrap2 : %d %d\n",r,c);
		}
		else if(aa[0][4]==0)
		{
			r=0;c=4;
		}
		else if(aa[4][0]==0)
		{
			r=4;c=0;
		}
		else if(aa[4][4]==0)
		{
			r=4;c=4;
		}
		else
		{
			for(k=0;k<9;k++)
			{
				ii=ia[k];jj=ja[k];
				////printf("^^\n%d\n%d\n",ii,jj);
				//	if(aa[i][j]==0 && aa[i-1][j]/10==3-p && aa[i+1][j]/10==3-p && aa[i][j+1]/10==3-p && aa[i][j-1]/10==3-p)
				//	{
				//		r=i;c=j;f=1;break;
				//	}
					if(aa[ii][jj]/10==p && aa[ii][jj]%10==3 && aa[ii-1][jj]/10==3-p && aa[ii+1][jj]/10==3-p && aa[ii][jj+1]/10==3-p && aa[ii][jj-1]/10==3-p)
					{
						r=ii;c=jj;f=1;break;//printf("1 : r:%d c:%d",r,c);
					}
					
			
			}
		
			if(ii==0 && jj>0 && jj<4 && aa[ii][jj]/10==p && aa[ii][jj]%10==2 && aa[ii][jj-1]/10==3-p && aa[ii][jj+1]/10==3-p && aa[ii+1][jj]/10==3-p )
					{
						r=ii;c=jj;////printf("2 : r:%d c:%d",r,c);
					}
			else if(ii==4 && jj<4 && jj>0 && aa[ii][jj]/10==p && aa[ii][jj]%10==2 && aa[ii][jj+1]/10==3-p && aa[ii][jj-1]/10==3-p && aa[ii-1][jj]/10==3-p )
					{
						r=ii;c=jj;////printf("3 : r:%d c:%d",r,c);
					}
			else if(jj==0 && ii>0 && ii<4 && aa[ii][jj]/10==p && aa[ii][jj]%10==2 && aa[ii-1][jj]/10==3-p && aa[ii+1][jj]/10==3-p && aa[ii][jj+1]/10==3-p )
					{
						r=ii;c=jj;////printf("4 : r:%d c:%d",r,c);
					}
			else if(jj==4 && ii>0 && ii<4 && aa[ii][jj]/10==p && aa[ii][jj]%10==2 && aa[ii-1][jj]/10==3-p && aa[ii+1][jj]/10==3-p && aa[ii][jj-1]/10==3-p )
					{
						r=ii;c=jj;////printf("5 : r:%d c:%d",r,c);
					}
			
					
			else if(ii==0 && jj==0 && aa[ii][jj]/10==p && aa[ii+1][jj]/10==3-p && aa[ii][jj+1]/10==3-p)	
			{
				r=ii+1;c=jj;//printf("6 : r:%d c:%d",r,c);
			}
			else if(ii==0 && jj==4 && aa[ii][jj]/10==p && aa[ii+1][jj]/10==3-p && aa[ii-1][jj]/10==3-p)	
			{
				r=ii+1;c=jj;////printf("7 : r:%d c:%d",r,c);
			}
			else if(ii==4 && jj==0 && aa[ii][jj]/10==p && aa[ii-1][jj]/10==3-p && aa[ii][jj+1]/10==3-p)	
			{
				r=ii;c=jj+1;////printf("8 : r:%d c:%d",r,c);
			}	
			else if(ii==4 && jj==4 && aa[ii][jj]/10==p && aa[ii-1][jj]/10==3-p && aa[ii][jj-1]/10==3-p)	
			{
				r=ii-1;c=jj;////printf("9 : r:%d c:%d",r,c);
			}
			
			
			
			
			int var=0,balls=0;f=0;////printf("##\n");
			//display(aa);
			for(k=0;k<9;k++)
			{
				ii=ia[k];jj=ja[k];
				
					if(aa[ii][jj]/10==p && aa[ii][jj]%10==3)
					{
						//printf("\n!!r: %d c: %d\n",ii,jj);
						if(aa[ii][jj-1]/10==p)
							{var++;	balls+=aa[ii][jj-1]%10;}
						if(aa[ii][jj+1]/10==p)
							{var++;	balls+=aa[ii][jj+1]%10;}
						if(aa[ii-1][jj-1]/10==p)
							{var++;	balls+=aa[ii-1][jj-1]%10;}
						if(aa[ii-1][jj+1]/10==p)
							{var++;	balls+=aa[ii-1][jj+1]%10;}
						if(aa[ii-1][jj]/10==p)
							{var++;	balls+=aa[ii-1][jj]%10;}
						if(aa[ii+1][jj-1]/10==p)
							{var++;	balls+=aa[ii+1][jj-1]%10;}
						if(aa[ii+1][jj+1]/10==p)
							{var++;	balls+=aa[ii+1][jj+1]%10;}
						if(aa[ii+1][jj]/10==p)
							{var++;	balls+=aa[ii+1][jj]%10;}
							
						if(var>=3 && balls>=8)
						{
							r=ii;c=jj;f=1;//printf("14 : r:%d c:%d",r,c);
							break;
						}
					}
			
			}
			
			if(aa[0][0]/10==p && aa[0][1]/10==p && aa[1][0]/10==p && aa[0][1]%10==2 && aa[1][0]%10==2 && ((aa[1][1]!=0) || aa[2][0]/10!=0 || aa[0][2]/10!=0))
			{
				r=ii;c=jj;//printf("10 : r:%d c:%d",r,c);
			} 
			else if(aa[4][0]/10==p && aa[3][0]/10==p && aa[4][1]/10==p && aa[4][1]%10==2 && aa[3][0]%10==2 && ((aa[3][1]!=0) || aa[2][0]/10!=0 || aa[4][2]/10!=0))
			{
				r=ii;c=jj;////printf("11 : r:%d c:%d",r,c);
			} 
			else if(aa[4][4]/10==p && aa[4][3]/10==p && aa[3][4]/10==p && aa[3][4]%10==2 && aa[4][3]%10==2 && ((aa[3][3]!=0) || aa[2][4]/10!=0 || aa[4][2]/10!=0))
			{
				r=ii;c=jj;////printf("12 : r:%d c:%d",r,c);
			} 
			else if(aa[0][4]/10==p && aa[0][3]/10==p && aa[1][4]/10==p && aa[0][3]%10==2 && aa[1][4]%10==2 && ((aa[1][3]!=0) || aa[0][2]/10!=0 || aa[2][4]/10!=0))
			{
				r=ii;c=jj;////printf("13 : r:%d c:%d",r,c);
			} 
			
			//printf("\n####\n");
			
			
			if(ii==0 && jj!=0 && jj!=4 && ((aa[ii][jj]%10>0 && aa[ii][jj]/10==p) || aa[ii][jj]==0))
			{
				r=ii;jj=c;////printf("15 : r:%d c:%d",r,c);
			}		
			else if(ii==4 && jj!=0 && jj!=4 && ((aa[ii][jj]%10>0 && aa[ii][jj]/10==p) || aa[ii][jj]==0))
			{
				r=ii;jj=c;////printf("16 : r:%d c:%d",r,c);
			}
			else if(jj==4 && ii!=0 && ii!=4 && ((aa[ii][jj]%10>0 && aa[ii][jj]/10==p) || aa[ii][jj]==0))
			{
				r=ii;jj=c;////printf("17 : r:%d c:%d",r,c);
			}
			else if(jj==0 && ii!=0 && ii!=4 && ((aa[ii][jj]%10>0 && aa[ii][jj]/10==p) || aa[ii][jj]==0))
			{
				r=ii;jj=c;////printf("18 : r:%d c:%d",r,c);
			}
			
			//printf("\n@#\n");
			
			for(k=0;k<9;k++)
			{
				ii=ia[k];jj=ja[k];
				
					if(aa[ii][jj]/10==p && aa[ii][jj]%10>=1 && aa[ii-1][jj]/10==3-p && aa[ii-1][jj]%10!=3 && aa[ii+1][jj]/10==3-p && aa[ii+1][jj]%10!=3  && aa[ii][jj+1]/10==3-p && aa[ii][jj+1]%10!=3  && aa[ii][jj-1]/10==3-p && aa[ii][jj-1]%10!=3 )
					{
						r=ii;c=jj;f=1;////printf("19 : r:%d c:%d",r,c);
						break;
					}		
				
			}
			//printf("!!\n");
		}

printf("%d %d",r,c);
exit(1);
}



if(i == 0 && j == 0)
{
if(M1[i][j]%10>2)
M1[i][j]=pc*10+((M1[i][j]%10)-2);
else
M1[i][j] = 0; 
M1[i+1][j]%=10; M1[i+1][j]= M1[i+1][j]+pc*10+1;   
M1[i][j+1]%=10; M1[i][j+1]= M1[i][j+1]+pc*10+1;
}
else if(i == 0 && j == 4)
{
if(M1[i][j]%10>2)
M1[i][j]=pc*10+((M1[i][j]%10)-2);
else
M1[i][j] = 0; 
M1[i+1][j]%=10; M1[i+1][j]= M1[i+1][j]+pc*10+1;
M1[i][j-1]%=10; M1[i][j-1]= M1[i][j-1]+pc*10+1;
}
else if(i == 4 && j == 0)
{
if(M1[i][j]%10>2)
M1[i][j]=pc*10+((M1[i][j]%10)-2);
else
M1[i][j] = 0; 
M1[i-1][j]%=10; M1[i-1][j]= M1[i-1][j]+pc*10+1;
M1[i][j+1]%=10; M1[i][j+1]= M1[i][j+1]+pc*10+1;
}
else if(i == 4 && j == 4)
{
if(M1[i][j]%10>2)
M1[i][j]=pc*10+((M1[i][j]%10)-2);
else
M1[i][j] = 0; 
M1[i-1][j]%=10; M1[i-1][j]= M1[i-1][j]+pc*10+1;
M1[i][j-1]%=10; M1[i][j-1]= M1[i][j-1]+pc*10+1;
}
else if(j == 0)
{

if(M1[i][j]%10>3)
M1[i][j]=pc*10+((M1[i][j]%10)-3);
else
M1[i][j] = 0; 
M1[i-1][j]%=10; M1[i-1][j]= M1[i-1][j]+pc*10+1;
M1[i+1][j]%=10; M1[i+1][j]= M1[i+1][j]+pc*10+1;
M1[i][j+1]%=10; M1[i][j+1]= M1[i][j+1]+pc*10+1;
}
else if(i == 0)
{

if(M1[i][j]%10>3)
M1[i][j]=pc*10+((M1[i][j]%10)-3);
else
M1[i][j] = 0; 
M1[i][j-1]%=10; M1[i][j-1]= M1[i][j-1]+pc*10+1;
M1[i][j+1]%=10; M1[i][j+1]= M1[i][j+1]+pc*10+1;
M1[i+1][j]%=10; M1[i+1][j]= M1[i+1][j]+pc*10+1;
}
else if(j == 4)
{

if(M1[i][j]%10>3)
M1[i][j]=pc*10+((M1[i][j]%10)-3);
else
M1[i][j] = 0; 
M1[i][j-1]%=10; M1[i][j-1]= M1[i][j-1]+pc*10+1;
M1[i+1][j]%=10; M1[i+1][j]= M1[i+1][j]+pc*10+1;
M1[i-1][j]%=10; M1[i-1][j]= M1[i-1][j]+pc*10+1;
}
else if(i == 4)
{

if(M1[i][j]%10>3)
M1[i][j]=pc*10+((M1[i][j]%10)-3);
else
M1[i][j] = 0; 
M1[i][j-1]%=10; M1[i][j-1]= M1[i][j-1]+pc*10+1;
M1[i][j+1]%=10; M1[i][j+1]= M1[i][j+1]+pc*10+1;
M1[i-1][j]%=10; M1[i-1][j]= M1[i-1][j]+pc*10+1;
}
else
{

if(M1[i][j]%10>4)
M1[i][j]=pc*10+((M1[i][j]%10)-4);
else
M1[i][j] = 0; 
M1[i][j-1]%=10; M1[i][j-1]= M1[i][j-1]+pc*10+1;
M1[i][j+1]%=10; M1[i][j+1]= M1[i][j+1]+pc*10+1;
M1[i+1][j]%=10; M1[i+1][j]= M1[i+1][j]+pc*10+1;
M1[i-1][j]%=10; M1[i-1][j]= M1[i-1][j]+pc*10+1;
}
if(i == 0 && j == 0)
{
if(checkMat(M1,i+1,j) == 1)
rec(M1,M2,i+1,j);
if(checkMat(M1,i,j+1) == 1)
rec(M1,M2,i,j+1);
}
else if(i == 0 && j == 4)
{
if(checkMat(M1,i+1,j) == 1)
rec(M1,M2,i+1,j);
if(checkMat(M1,i,j-1) == 1)
rec(M1,M2,i,j-1);
}
else if(i == 4 && j == 0)
{
if(checkMat(M1,i-1,j) == 1)
rec(M1,M2,i-1,j);
if(checkMat(M1,i,j+1) == 1)
rec(M1,M2,i,j+1);
}
else if(i == 4 && j == 4)
{
if(checkMat(M1,i-1,j) == 1)
rec(M1,M2,i-1,j);
if(checkMat(M1,i,j-1) == 1)
rec(M1,M2,i,j-1);
}
else if(j == 0)
{
if(checkMat(M1,i-1,j) == 1)
{
rec(M1,M2,i-1,j);}
if(checkMat(M1,i+1,j) == 1)
{
rec(M1,M2,i+1,j);}
if(checkMat(M1,i,j+1) == 1)
{
rec(M1,M2,i,j+1);}

}
else if(i == 0)
{
if(checkMat(M1,i,j-1) == 1)
{
rec(M1,M2,i,j-1);}
if(checkMat(M1,i,j+1) == 1)
{
rec(M1,M2,i,j+1);}
if(checkMat(M1,i+1,j) == 1)
{
rec(M1,M2,i+1,j);}
}
else if(j == 4)
{
if(checkMat(M1,i,j-1) == 1)
{
rec(M1,M2,i,j-1);}
if(checkMat(M1,i+1,j) == 1)
{
rec(M1,M2,i+1,j);}
if(checkMat(M1,i-1,j) == 1)
{
rec(M1,M2,i-1,j);}
}
else if(i == 4)
{
if(checkMat(M1,i,j-1) == 1)
{
rec(M1,M2,i,j-1);}
if(checkMat(M1,i,j+1) == 1)
{
rec(M1,M2,i,j+1);}
if(checkMat(M1,i-1,j+1) == 1)
{
rec(M1,M2,i-1,j);}
}
else
{
if(checkMat(M1,i,j-1) == 1)
{
rec(M1,M2,i,j-1);}
if(checkMat(M1,i,j+1) == 1)
{
rec(M1,M2,i,j+1);}
if(checkMat(M1,i+1,j) == 1)
{
rec(M1,M2,i+1,j);}
if(checkMat(M1,i-1,j) == 1)
{rec(M1,M2,i-1,j);}
}
for(I = 0; I < 5; I++)
{
for(J=0;J<5;J++)
M2[I][J] = M1[I][J];
}
}
示例#7
0
int main(){

//int a[5][5]={{11,12,12,0,0},{11,0,13,0,0},{0,0,0,0,22},{22,13,23,0,0},{0,21,0,0,21}};
/*int a[5][5] = {{11,0,12,21,21},
					{11,23,13,23,11},
					{11,21,23,11,11},
					{22,0,23,12,11},
					{12,21,22,11,21}}; */
int n=5,p,fl=0,r=0,c=0,i,j,count=0,count2=0,diff=-999,b,pli,plj,pl2,d,max,flg=0,k;
//int a[5][5];//={{11,12,12,12,21},{12,11,11,13,0},{11,11,13,12,11},{11,13,13,12,0},{21,12,12,0,21}};
int a[5][5];//={{21,11,11,12,11},{12,12,11,12,12},{12,13,13,12,11},{11,13,0,12,12},{11,11,12,22,21}};
int M1[5][5], M2[5][5];

//Taking input matrix

for(i=0;i<n;i++){
for( j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
//taking players-code 
//display(a);
scanf("%d",&p);
pc = p;
/*while(flag){
r=rand()%5;//randomly placing output
c=rand()%5;
if(a[r][c]/10==p||a[r][c]/10==0)//check randomly generated box to be 
flag=0;
} */
//count = 
//acquire(a,p);
//b = checkMat(a,2,3);
//rec(M1,M2,3,2);

for(i = 0; i<5;i++)
{//printf("\n-4: ***********\n");
for(j=0;j<5;j++)
{
	if(a[i][j]/10!=p)continue;
copy(M2,a);copy(aa,a);//printf("\n-1: i:%d j:%d r:%d c:%d\n",i,j,r,c);
M2[i][j]%=10;
M2[i][j]++;
M2[i][j]+=(10*p);
b=checkMat(M2,i,j);
//printf("\nb:%d\n",b);
if(b==1)
{//	//printf("\n-2: r:%d c:%d\n",r,c);
rec(M2,M1,i,j);// printf("\n-2: r:%d c:%d\n",r,c);
 count=acquire(M1,3-p);
if(count==0)
{
	r=i;c=j;flg=1;//printf("\n-3: r:%d c:%d\n",r,c);
}
else if((count==1 || count==2 || count==3 ) && nz(M1)<10)
{
	r=i;c=j;flg=1;
}
}

}
}
////printf("\n0: r:%d c:%d\n",r,c);
		if(a[0][0]/10==3-p && a[0][1]/10==p && a[1][0]/10==p && a[0][1]%10==2 )
		{
			r=0;c=1;flg=1;////printf("\n1: r:%d c:%d\n",r,c);|| a[1][0]%2==0)
		}
		else if(a[0][0]/10==3-p && a[1][0]/10==p && a[0][0]/10==p && a[1][0]%10==2 )
		{
			r=1;c=0;flg=1;////printf("\n1: r:%d c:%d\n",r,c);|| a[1][0]%2==0)
		}
		else if(a[0][4]/10==3-p && a[0][3]/10==p && a[1][4]/10==p && a[0][3]%10==2 )
		{
			r=0;c=3;flg=1;////printf("\n1: r:%d c:%d\n",r,c);|| a[1][0]%2==0)
		}
		else if(a[0][4]/10==3-p && a[0][3]/10==p && a[1][4]/10==p && a[1][4]%10==2 )
		{
			r=1;c=4;flg=1;////printf("\n1: r:%d c:%d\n",r,c);|| a[1][0]%2==0)
		}
		else if(a[4][0]/10==3-p && a[3][0]/10==p && a[4][1]/10==p && a[4][1]%10==2 )
		{
			r=4;c=1;flg=1;////printf("\n1: r:%d c:%d\n",r,c);|| a[1][0]%2==0)
		}
		else if(a[4][0]/10==3-p && a[3][0]/10==p && a[4][1]/10==p && a[3][0]%10==2 )
		{
			r=3;c=0;flg=1;////printf("\n1: r:%d c:%d\n",r,c);|| a[1][0]%2==0)
		}
		else if(a[4][4]/10==3-p && a[3][4]/10==p && a[4][3]/10==p && a[3][4]%10==2 )
		{
			r=3;c=4;flg=1;////printf("\n1: r:%d c:%d\n",r,c);|| a[1][0]%2==0)
		}
		else if(a[4][4]/10==3-p && a[3][4]/10==p && a[4][3]/10==p && a[4][3]%10==2 )
		{
			r=4;c=3;flg=1;////printf("\n1: r:%d c:%d\n",r,c);|| a[1][0]%2==0)
		}
		
		else if((a[0][0]/10==p && a[0][1]/10==3-p && a[1][0]/10==3-p && (a[0][1]%10==2 || a[1][0]%2==0)))
		{
			r=0;c=0;flg=1;//printf("\n-8: r:%d c:%d\n",r,c);
		}
		else if((a[0][4]/10==p && a[0][3]/10==3-p && a[1][4]/10==3-p && (a[1][4]%10==2 || a[0][3]%2==0)))
		{
			r=0;c=4;flg=1; ////printf("!!1");
		}
		else if((a[4][0]/10==p && a[4][1]/10==3-p && a[3][0]/10==3-p && (a[4][1]%10==2 || a[3][0]%2==0)))
		{
			r=4;c=0;flg=1;
		}
		else if((a[4][4]/10==p && a[3][4]/10==3-p && a[4][3]/10==3-p && (a[3][4]%10==2 || a[4][3]%2==0)))
		{
			r=4;c=4;flg=1;
		}
		
		else if(a[0][0]/10==0 && a[0][1]/10==3-p && a[1][0]/10==3-p&& a[0][1]%10!=2 && a[1][0]%10!=2)
		{
			r=0;c=0;flg=1;//printf("\n1: r:%d c:%d\n",r,c);
		}
		else if((a[0][4]/10==0 && a[0][3]/10==3-p && a[1][4]/10==3-p) && a[0][3]%10!=2 && a[1][4]%10!=2)
		{
			r=0;c=4;flg=1;////printf("!!2");
		}
		else if((a[4][0]/10==0 && a[4][1]/10==3-p && a[3][0]/10==3-p) && a[4][1]%10!=2 && a[3][0]%10!=2)
		{
			r=4;c=0;flg=1;
		}
		else if((a[4][4]/10==0 && a[3][4]/10==3-p && a[4][3]/10==3-p) && a[4][3]%10!=2 && a[3][4]%10!=2)
		{
			r=4;c=4;flg=1;
		}
		
		
		else if((a[0][0]/10==0 && (a[0][1]/10==3-p || a[1][0]/10==3-p))&& nz(a)>8 && a[0][1]%10!=2 && a[1][0]%10!=2)
		{
			r=0;c=0;flg=1;//printf("\n2: r:%d c:%d\n",r,c);
		}
		else if((a[0][4]/10==0 && (a[0][3]/10==3-p || a[1][4]/10==3-p))&& nz(a)>8 && a[0][3]%10!=2 && a[1][4]%10!=2)
		{
			r=0;c=4;flg=1;////printf("!!3");
		}
		else if((a[4][0]/10==0 && (a[4][1]/10==3-p || a[3][0]/10==3-p))&& nz(a)>8 && a[4][1]%10!=2 && a[3][0]%10!=2)
		{
			r=4;c=0;flg=1;
		}
		else if((a[4][4]/10==0 && (a[3][4]/10==3-p || a[4][3]/10==3-p))&& nz(a)>8 && a[4][3]%10!=2 && a[3][4]%10!=2)
		{
			r=4;c=4;flg=1;
		}
		else if((a[0][1]/10==p && a[0][1]%10==2)  && a[0][0]/10==3-p)
		{
			r=0;c=1;flg=1;
		}
		else if((a[1][0]/10==p && a[1][0]%10==2)  && a[0][0]/10==3-p)
		{
			r=1;c=0;flg=1;
		}
			else if((a[4][1]/10==p && a[4][1]%10==2)  && a[4][0]/10==3-p)
		{
			r=4;c=1;flg=1;
		}
			else if((a[3][0]/10==p && a[3][0]%10==2)  && a[4][0]/10==3-p)
		{
			r=3;c=0;flg=1;
		}
			else if((a[3][4]/10==p && a[3][4]%10==2)  && a[4][4]/10==3-p)
		{
			r=3;c=4;flg=1;
		}
			else if((a[4][3]/10==p && a[4][3]%10==2)  && a[4][4]/10==3-p)
		{
			r=4;c=3;flg=1;
		}
			else if((a[0][3]/10==p && a[0][3]%10==2)  && a[0][4]/10==3-p)
		{
			r=0;c=3;flg=1;
		}
			else if((a[1][4]/10==p && a[1][4]%10==2)  && a[0][4]/10==3-p)
		{
			r=1;c=4;flg=1;
		}
		else if(a[0][0]==0&& nz(a)>8 && a[0][1]%10!=2 && a[1][0]%10!=2)
		{r=0;c=0;flg=1;//printf("\n3: r:%d c:%d\n",r,c);
		}
		else if(a[0][4]==0&& nz(a)>8 && a[0][3]%10!=2 && a[1][4]%10!=2)
		{
			r=0;c=4;flg=1;////printf("!!4");
		}
		else if(a[4][0]==0&& nz(a)>8 && a[4][1]%10!=2 && a[3][0]%10!=2)
		{
			r=4;c=0;flg=1;
		}
		else if(a[4][4]==0&& nz(a)>8 && a[4][3]%10!=2 && a[3][4]%10!=2)
		{
			r=4;c=4;flg=1;
		}
		else if(a[0][0]!=0 && a[0][4]!=0 && a[4][0]!=0 && a[4][4]!=0 && a[2][2]/10!=3-p &&  nz(a)>10)
		{
		/*	if((a[0][0]/10 == 3-p && a[0][1]/10==3-p && a[1][0]/10==3-p)) 
				{r=1;c=1;flg=1;}
			else if (a[0][4]/10 == 3-p && a[0][3]/10==3-p && a[1][4]/10==3-p)
			{ r = 3; c = 1; flg = 1;}
			
			else if(a[4][0]/10 == 3-p && a[3][0]/10==3-p && a[4][1]/10==3-p )
			{
				r=3,c=1;flg=1;
			}
			else if(a[4][4]/10 == 3-p && a[4][3]/10==3-p && a[3][4]/10==3-p )
			{
				r=3,c=3;flg=1;
			}
			else
			{				*/
				r=2;c=2;flg=1;
		//	}
		}

if(flg==0){
max=-999;//printf("\nrec\n");
for(k=0;k<25;k++)
{	i=mati[k];j=matj[k];

copy(M2,a);

d=M2[i][j];z=0;pl2 = 0;
if((p==1 && (d != 21 && d != 22 && d != 23)) || (p==2 && (d != 11 && d != 12 && d != 13)))
{	if((a[0][0]==(p*10+1) && i==0 && j==0 && a[0][1]==0 && a[1][0]==0)	|| (a[0][4]==(p*10+1) && i==0 && j==4 && a[0][3]==0 && a[1][4]==0) ||(a[4][0]==(p*10+1) && i==4 && j==0 && a[4][1]==0 && a[0][3]==0)||(a[4][4]==(p*10+1) && i==4 && j==4 && a[4][3]==0 && a[3][4]==0))			
	continue;
M2[i][j]%=10;
M2[i][j]++;
M2[i][j]+=(10*p);
b=checkMat(M2,i,j);
if(b==1)
{copy(aa,a);rec(M2,M1,i,j); 
 count=acquire(M1,p);
 count2=acquire(M1,3-p);
 
if(count2==0)
{
	r=i;c=j;fl=1;break;
}
}
else
{
count=acquire(M2,p);
count2=acquire(M2,3-p);
if(count2==0)
{
	r=i;c=j;fl=1;break;
}
}
diff=count-count2;
if(diff > max)
{
max = diff;r = i;c = j;
}
}
}

}

printf("%d %d",r,c);//outputs your move
}