zoj 搜索(一)

zoj1002

#include<iostream>
using namespace std;
#define MaxLen 4
char cMap[MaxLen][MaxLen];
int iBest,n;

bool CanPut(int row,int col)
{
	int i;
	for(i=row-1;i>=0;i--)
	{
		if(cMap[i][col]=='O') 
			return false;
		if(cMap[i][col]=='X')
			break;
	}
	for(i=col-1;i>=0;i--)
	{
		if(cMap[row][i]=='O')
			return false;
		if(cMap[row][i]=='X')
			break;
	}
	return true;
}

void solve(int k,int current)
{
	int x,y;
	if(k==n*n)
	{
		if(current>iBest)
		{
			iBest=current;
			return ;
		}
	}
	else
	{
		x=k/n;
		y=k%n;
		if(cMap[x][y]=='.' && CanPut(x,y))
		{
			cMap[x][y]='O';
			solve(k+1,current+1);
			cMap[x][y]='.';
		}
		solve(k+1,current);
	}
}

int main()
{
	int i,j;
	while(scanf("%d",&n)&&n)
	{
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				cin>>cMap[i][j];
		iBest=0;
		solve(0,0);
		printf("%d\n",iBest);
	}
	return 0;
}

zoj1047

#include<stdio.h>
int n;
int q;
int iSquare[25][4];
int iCount[25];
int iTable[25];

int Place(int iPos)
{
	int i;
	if(iPos==n*n)
		return 1;
	for(i=0;i<q;i++)
	{
		if(iCount[i]==0)
			continue;
		if(iPos%n!=0)
			if(iSquare[iTable[iPos-1]][1]!=iSquare[i][3])
				continue;
		if(iPos>=n)
			if(iSquare[iTable[iPos-n]][2]!=iSquare[i][0])
				continue;
		iTable[iPos]=i;
		iCount[i]--;
		if(Place(iPos+1)==1)
			return 1;
		iCount[i]++;
	}
	return 0;
}

int main()
{
	int i,j;
	int iCase=0;
	int top,right,bottom,left;
	while(scanf("%d",&n)&&n)
	{
		iCase++;
		q=0;
		for(i=0;i<n*n;i++)
		{
			scanf("%d%d%d%d",&top,&right,&bottom,&left);
			for(j=0;j<q;j++)
			{
				if(iSquare[j][0]==top&&iSquare[j][1]==right&&iSquare[j][2]==bottom&&iSquare[j][3]==left)
				{
					iCount[j]++;
					break;
				}
			}
			if(j==q)
			{
				iSquare[j][0]=top;
				iSquare[j][1]=right;
				iSquare[j][2]=bottom;
				iSquare[j][3]=left;
				iCount[j]=1;
				q++;
			}
		}
		if(iCase>1)
			printf("\n");
		if(Place(0)==1)
			printf("Game %d:Possible\n",iCase);
		else
			printf("Game %d: Impossible\n",iCase);
	}
	return 0;
}


zoj1047

#include<stdio.h>
#include <memory.h>

char s[30][30]; 
int flag[30][30];
int diagonal[4][2] = {{1,1}, {-1,1}, {-1,-1}, {1,-1}};
int x_y[4][2] = {{1,0}, {0,1}, {-1,0}, {0,-1}};
int total;
int rows, cols;

void work (int x,int y)
{ 
	int i;
	int newx,newy; 
	flag[x][y] = 1;
	for (i=0; i<4; i++)
	{
		newx = x+x_y[i][0]; 
		newy = y+x_y[i][1]; 
		if ((s[newx][newy]=='X') && (flag[newx][newy]==0))	
			work (newx,newy);
		else if (s[newx][newy]=='.') 
			total++;
	}
	for (i=0; i<4; i++)
	{
		newx = x+diagonal[i][0]; 
		newy = y+diagonal[i][1];
		if ((s[newx][newy]=='X') && (flag[newx][newy]==0))	
			work (newx,newy);
	}
}

int main ()
{
	while (scanf ("%d", &rows) && rows)
	{
		int click_x, click_y;
		scanf ("%d%d%d\rows", &cols, &click_x, &click_y);
		memset(s, '.', sizeof(s));
		memset(flag, 0, sizeof(flag));
		int i, j;
		char image[40];
		for (i=1; i<=rows; i++) {
			scanf ("%s",image);
			for (j=1; j<=cols; j++) 
				s[i][j] = image[j-1];
		}
		total=0;
		work (click_x,click_y);
		printf ("%d\n",total);
	}
}


zoj1054

#include<stdio.h>
struct Customer
{
	int feature,sales;
}cust[21];
int M,N;
int minCost,maxCost;
unsigned int iMask[32];
unsigned int iCost[21];
int dollars,cost,profit;
int featureSet;
int maxMargin;
int minFeatures,minCount;

void Search(int currSet,int featureNum,int nCost,int features)
{
	if(featureNum>N)
	{
		if(nCost<minCost||nCost>maxCost)
			return;
		int temProf=0;
		int nCount=0;
		for(int i=1;i<=M;i++)
		{
			if((currSet&cust[i].feature)==cust[i].feature)
			{
				temProf+=cust[i].sales;
				nCount++;
			}
		}
		int nProfit=(int)(1000.0*temProf/nCost+0.5);
		if(nProfit<profit)
			return;
		int margin=temProf-nCost;
		if((nProfit==profit&&margin<maxMargin) || (nProfit==profit&&margin==maxMargin&&features>minFeatures) || 
			(nProfit==profit&&margin==maxMargin&&features==minFeatures&&nCount<=minCount))
			return;
		profit=nProfit;
		maxMargin=margin;
		minFeatures=features;
		minCount=nCount;
		featureSet=currSet;
		dollars=temProf;
		cost=nCost;
		return;
	}
	if(nCost>maxCost)
		return;
	Search(currSet|iMask[featureNum],featureNum+1,nCost+iCost[featureNum],features+1);
	Search(currSet,featureNum+1,nCost,features);
}


int main()
{
	int i,j;
	for(i=0;i<32;i++)
		iMask[i]=(1<<i);
	int iCase;
	scanf("%d",&iCase);
	for(int dataSets=1;dataSets<=iCase;dataSets++)
	{
		scanf("%d%d%d%d",&minCost,&maxCost,&N,&M);
		for(i=1;i<=N;i++)
			scanf("%d",&iCost[i]);
		int k;
		int number;
		for(i=1;i<=M;i++)
		{
			scanf("%d",&k);
			cust[i].feature=0;
			for(j=1;j<=k;j++)
			{
				scanf("%d",&number);
				cust[i].feature+=iMask[number];
			}
			scanf("%d",&cust[i].sales);
		}
		featureSet=0;
		profit=0;
		maxMargin=0;
		minFeatures=0;
		minCount=0;
		dollars=0;
		cost=0;
		Search(0,1,0,0);
		printf("Feature Set %d\n",dataSets);
		printf("%0.3f\n",profit/1000.0);
		printf("%d\n",dollars);
		printf("%d\n",cost);
		bool flag=false;
		for(i=1;i<=N;i++)
		{
			if((featureSet&iMask[i])!=0)
			{
				if(flag)
					printf(" ");
				else
					flag=true;
				printf("%d",i);
			}
		}
		printf("\n");
		flag=false;
		for(i=1;i<=M;i++)
		{
			if((featureSet&cust[i].feature)==cust[i].feature)
			{
				if(flag)
					printf(" ");
				else
					flag=true;
				printf("%d",i);
			}
		}
		printf("\n");
	}
	return 0;
}

1075

#include<stdio.h>
char a[12][4];
bool fun(int i,int j,int k,int n)
{
	if(a[i][n]!=a[j][n]&&a[i][n]!=a[k][n]&&a[j][n]!=a[k][n])
		return true;
	if(a[i][n]==a[j][n]&&a[i][n]==a[k][n]&&a[j][n]==a[k][n])
		return true;
	return false;
}

int main()
{
	bool line=false;
	int i,j,k,m;
	while(scanf("%s",a[0])!=EOF)
	{
		m=0;
		for(i=1;i<12;i++)
			scanf("%s",a[i]);
		if(line)
			printf("\n");
		printf("CARDS: ");
		for(i=0;i<12;i++)
			printf(" %.4s",a[i]);
		printf("\n");
		printf("SETS:   ");
		for(i=0;i<12;i++)
			for(j=i+1;j<12;j++)
				for(k=j+1;k<12;k++)
					if(fun(i,j,k,0)&&fun(i,j,k,1)&&fun(i,j,k,2)&&fun(i,j,k,3))
					{
						m++;
						if(m==1)
						{
							printf("%d. ",m);
						}
						else
						{
							printf("    %d. ",m);
							if(m<=9)
								printf(" ");
						}
						printf("%.4s",a[i]);
						printf(" %.4s",a[j]);
						printf(" %.4s\n",a[k]);
					}
		if(m==0)
			printf("*** None Found ***\n");
		line=true;
	}
	return 0;
}


zoj1079

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int queue[501];
int used[500];

struct {
	int id;
	int side;
}piece[500][4];

struct position{
	int x, y;
	int id;
	int side;
}pos[500];

int compare(const void *a,const void *b)
{
	int c;
	if((c=(((struct position*)a)->x-((struct position*)b)->x))!=0)
		return(c);
	return((((struct position*)a)->y-((struct position*)b)->y));
}

int main()
{
	int n, k;
	int i;
	int cases = 1;
	while(scanf("%d", &n) && n)
	{
		scanf("%d", &k);
		memset(piece, 255, sizeof(piece));
		memset(used, 0, sizeof(used));
		int a, b, c, d;
		for(i=0; i<k; i++)
		{
			scanf("%d%d%d%d", &a, &b, &c, &d);
			piece[a][b].id = c;
			piece[a][b].side = d;
			piece[c][d].id = a;
			piece[c][d].side = b;
		}
		for(i=0; i<n; i++)
			pos[i].id = i;
		pos[0].x = 0;
		pos[0].y = 0;
		pos[0].side = 0;
		int first = 0;
		int count = 0;
		queue[0] = 0;
		used[0] = 1;
		while (first<=count)
		{
			a = queue[first];
			int x0 = pos[a].x;
			int y0 = pos[a].y;
			d = pos[a].side;
			int number;
			for(i=0; i<4; i++)
				if((number=piece[a][i].id)>=0)
					if(used[number]==0)
					{
						b = piece[a][i].side;
						used[number] = 1;
						pos[number].x = x0+dx[(i-d)&3];
						pos[number].y = y0+dy[(i-d)&3];
						pos[number].side = ((b-i+d+2)&3);
						queue[++count] = number;
					}
			first++;
		}
		qsort(pos, n, sizeof(position), &compare);
		a = pos[0].x;
		b = pos[0].y;
		printf("Instance %d:\n",cases++);
		for(i=0; i<n; i++)
			printf("%5d%5d%6d%2d\n", pos[i].x-a, pos[i].y-b, pos[i].id, pos[i].side);
	}
	return 0;
}

1080

#include<stdio.h>
#include<memory.h>
#define MAXN 20
 
struct Matrix
{
	char data[MAXN][MAXN];
	int size;
	Matrix()
	{
		memset(data, 0, sizeof(data));
		size = 0;
	}
};
 
char Sub(Matrix& A, Matrix& B, int i, int j, Matrix& valid)
{
	for(int x = -1; x <= 1; x ++)
		for(int y = -1; y <= 1; y ++)
			if(A.data[i+x][j+y] < B.data[1+x][1+y])
				return '0';
 
	for(int x = -1; x <= 1; x ++)
		for(int y = -1; y <= 1; y ++)
			if(A.data[i+x][j+y] == '1' && B.data[1+x][1+y] == '1')
				valid.data[i+x][j+y] = 1;
 
	return '1';
}
 
bool Substract(Matrix& A, Matrix& B, Matrix& C)
{
	Matrix valid;
	valid.size = A.size;
	C.size = A.size - 2;
	for(int i = 0; i < C.size; i ++)
		for(int j = 0; j < C.size; j ++)
			C.data[i][j] = Sub(A, B, i+1, j+1, valid);
 
	for(int i = 0; i < A.size; i ++)
		for(int j = 0; j < A.size; j ++)
			if(A.data[i][j] == '1' && valid.data[i][j] == 0)
				return false;
	
	return true ;
}
 
bool Solve(Matrix& A, Matrix& B, int index)
{
	if (A.size < 3) return false;
	if (A.size == 3) return true;
	if (index == 9)
	{
		Matrix A1, B1;
		B1.size = 3;
		if (Substract(A, B, A1))	return Solve(A1, B1, 0);
		else  return false;
	}
	int i = index / 3;
	int j = index % 3;
	B.data[i][j] = '0';
	if (Solve(A, B, index+1)) return true;
	B.data[i][j] = '1';
	if (Solve(A, B, index+1)) return true;
	return false;
}
 
int main()
{
	int i, j;
	Matrix A, B;
	int cases = 0;
	char line[MAXN];
	while(scanf("%d\n", &A.size) && A.size)
	{
		for(i = 0; i < A.size; i ++) {
			gets(line);
			for(j = 0; j < A.size; j ++)
				A.data[i][j] = line[j];
		}
		B.size = 3;
		printf("Instance %d:\n", ++cases);
		if(A.size%2 && Solve(A, B, 0))
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0 ;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值