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 ;
}