1815:画家问题 C

描述

有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。

02110523_c221.jpg

输入

第一行是一个整数n (1≤n ≤15),表示墙的大小。接下来的n行表示墙的初始状态。每一行包含n个字符。第i行的第j个字符表示位于位置(i,j)上的砖的颜色。“w”表示白砖,“y”表示黄砖。

输出

一行,如果Bob能够将所有的砖都涂成黄色,则输出最少需要涂画的砖数,否则输出“inf”。

样例输入

5
wwwww
wwwww
wwwww
wwwww
wwwww

样例输出

15

——————————————————————分割线————————————————————

源代码

#include<stdio.h>
int puzzle[20][20];
int press[20][20];
int n;
int ans;
int p=1;
bool guess()
	{
	int i,j;
	for(i=2;i<=n;i++)
	for(j=1;j<=n;j++)
	press[i][j]=(puzzle[i-1][j]+press[i-1][j-1]+press[i-1][j]+press[i-1][j+1]+press[i-2][j])%2;
	for(j=1;j<=n;j++)
	if(press[n][j]!=(puzzle[n][j]+press[n][j-1]+press[n][j+1]+press[n-1][j])%2)
	return true;
	return false;
	}
	void solve()
		{
		for(c=1;c<=n;c++)
		press[1][c]=0;
		while(guess())
			{
			if(p==5000)
			break;
			p++;
			press[1][1]++;
			c=1;
			while(press[1][c]>1)
				{
				press[1][c]=0;
				c++;
				press[1][c]++;
				}	
			}
		}
		int main()
			{
			int i,j;
			scanf("%d",&n);
			for(i=0;i<=n;i++)
			puzzle[i][0]=puzzle[i][n+1]=press[i][0]=press[i][n+1]=0;
			for(j=0;j<=n+1;j++)
			puzzle[0][j]=puzzle[n][j]=press[0][j]=press[n][j]=0;
			char c[20];
			int a=1;
			for(i=1;i<=n;i++)
				{
				scanf("%s",&c);
				for(j=0;j<=n-1;j++)
					{
					if(c[j]=='w')
						{
						puzzle[i][j+1]=1;
						a=0;
						}
						else
						puzzle[i][j+1]=0;
					}
				}
				if(a==0)	
				solve();
				for(i=1;i<=n;i++)
				for(j=1;j<=n;j++)
				if(press[i][j]==1)
				ans++;
				if(p==5000)
				printf("inf\n");
				else	
				printf("%d\n",ans);	
				return 0;
			}

 

转载于:https://my.oschina.net/u/3775929/blog/1617244

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用OpenGL实现画家算法的示例代码,主要实现了画线、画圆、椭圆、矩形和填充矩形等基本图形的绘制: ```c++ #include <GL/glut.h> int width = 800, height = 600; // 窗口宽高 int x1, y1, x2, y2; // 两个点的坐标 int radius, x, y; // 圆的半径和圆心坐标 int a, b; // 椭圆的长短半轴 bool fillRect = false; // 是否填充矩形 void init() { glClearColor(1.0, 1.0, 1.0, 0.0); glColor3f(0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, (GLdouble) width, 0.0, (GLdouble) height); } void drawPixel(int x, int y) { glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); } void drawLine(int x1, int y1, int x2, int y2) { int dx = x2 - x1, dy = y2 - y1; int steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy); float xInc = dx / (float) steps, yInc = dy / (float) steps; float x = x1, y = y1; for (int i = 0; i <= steps; i++) { drawPixel((int) x, (int) y); x += xInc; y += yInc; } } void drawCircle(int radius, int x, int y) { int d = 3 - 2 * radius; int xc = 0, yc = radius; while (xc <= yc) { drawPixel(x + xc, y + yc); drawPixel(x + xc, y - yc); drawPixel(x - xc, y + yc); drawPixel(x - xc, y - yc); drawPixel(x + yc, y + xc); drawPixel(x + yc, y - xc); drawPixel(x - yc, y + xc); drawPixel(x - yc, y - xc); if (d < 0) { d = d + 4 * xc + 6; } else { d = d + 4 * (xc - yc) + 10; yc--; } xc++; } } void drawEllipse(int a, int b, int x, int y) { float d1 = b * b + a * a * (-b + 0.25); float dx = 2 * b * b * x, dy = 2 * a * a * y; float d2; while (dx < dy) { drawPixel(x, y); drawPixel(-x, y); drawPixel(x, -y); drawPixel(-x, -y); if (d1 < 0) { x++; dx += 2 * b * b; d1 += dx + b * b; } else { x++; y--; dx += 2 * b * b; dy -= 2 * a * a; d1 += dx - dy + b * b; } } d2 = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b; while (y >= 0) { drawPixel(x, y); drawPixel(-x, y); drawPixel(x, -y); drawPixel(-x, -y); if (d2 > 0) { y--; dy -= 2 * a * a; d2 += a * a - dy; } else { y--; x++; dx += 2 * b * b; dy -= 2 * a * a; d2 += dx - dy + a * a; } } } void drawRectangle(int x1, int y1, int x2, int y2) { drawLine(x1, y1, x2, y1); drawLine(x2, y1, x2, y2); drawLine(x2, y2, x1, y2); drawLine(x1, y2, x1, y1); } void fillRectangle(int x1, int y1, int x2, int y2) { for (int i = x1; i <= x2; i++) { for (int j = y1; j <= y2; j++) { drawPixel(i, j); } } } void display() { glClear(GL_COLOR_BUFFER_BIT); if (fillRect) { fillRectangle(x1, y1, x2, y2); } else { drawRectangle(x1, y1, x2, y2); } drawCircle(radius, x, y); drawEllipse(a, b, x, y); glFlush(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'r': glColor3f(1.0, 0.0, 0.0); // 红色 break; case 'g': glColor3f(0.0, 1.0, 0.0); // 绿色 break; case 'b': glColor3f(0.0, 0.0, 1.0); // 蓝色 break; case 'y': glColor3f(1.0, 1.0, 0.0); // 黄色 break; case 'm': glColor3f(1.0, 0.0, 1.0); // 紫色 break; case 'c': glColor3f(0.0, 1.0, 1.0); // 青色 break; case 'w': glColor3f(1.0, 1.0, 1.0); // 白色 break; case 'f': fillRect = !fillRect; break; case 27: // ESC键 exit(0); break; default: break; } glutPostRedisplay(); } void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { x1 = x; y1 = height - y; } else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) { x2 = x; y2 = height - y; glutPostRedisplay(); } else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) { x = x; y = height - y; radius = 0; } else if (button == GLUT_RIGHT_BUTTON && state == GLUT_UP) { x = x; y = height - y; radius = (int) sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1)); glutPostRedisplay(); } else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) { x = x; y = height - y; a = abs(x - x1); b = abs(y - y1); } else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_UP) { x = x; y = height - y; a = abs(x - x1); b = abs(y - y1); glutPostRedisplay(); } } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(width, height); glutInitWindowPosition(100, 100); glutCreateWindow("Painter's Algorithm"); init(); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutMouseFunc(mouse); glutMainLoop(); return 0; } ``` 注意:以上代码仅供参考,实际应用时需要根据具体的需求进行修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值