dfs qipan

#include<iostream>
char data[16];
int a[16];
int d[4]={-4,1,4,-1};
char b[16];
int flag;
int count=0;
int min=1000;
void dfs(int step)
{
	if(step==16)
	{
		/* for(int i=0;i<16;i++)
			 printf("%d",a[i]);
		 printf("\n");*/
		count=0;flag=1;
		for(int i=0;i<16;i++)
			b[i]=data[i];
		for(int i=0;i<16;i++)
		{
			/*if(a[i]==0)
				b[i]=data[i];*/
			if(a[i]==1)
			{
				if(b[i]==‘b‘)
			      {
					  b[i]=‘w‘;
				  }
				else

				{
					b[i]=‘b‘;
				}
				for(int j=0;j<4;j++)
					{
						if(i+d[j]>=0&&i+d[j]<16)
						{
							if(b[i+d[j]]==‘w‘)
						       {
								   b[i+d[j]]=‘b‘;
							  }
						  else
						  {
						     b[i+d[j]]=‘w‘;
						   }
						}

				   }
			}	

		}	/* for(int i=0;i<16;i++)
		  {
			printf("%c",b[i]);
		  }
			 printf("\n");*/

			for(int i=0;i<16;i++)
               {
				   if(b[0]==b[i])
			       flag=1;
			        else
					{
				     flag=0;
				   break;
			        }
			   }
	/*if(b[0]==b[1]==b[2]==b[3]==b[4]==b[5]==b[6]==b[7]==b[8]==b[9]==b[10]==b[11]==b[12]==b[13]==b[14]==b[15])
		   flag=1;*/
			if(flag==1)
			{
				 printf("!!");
               for(int i=0;i<16;i++)
                 { if(a[i]==1)
				     count++;
			      }
			   printf("%d  ",count);
			}

		return ;
	}
	for(int i=0;i<2;i++)
	 {
		 a[step]=i;
	     dfs(step+1);
	 }
}
int main()
{    freopen("input.txt","r",stdin);
	  for(int i=0;i<16;i++)
		{
			 scanf("%c",&data[i]);
		}
	for(int i=0;i<16;i++)
		{
			b[i]=data[i];
		}

	dfs(0);

}
时间: 2024-10-14 20:06:44

dfs qipan的相关文章

解救小哈——DFS算法举例

一.问题引入 有一天,小哈一个人去玩迷宫.但是方向感不好的小哈很快就迷路了.小哼得知后便去解救无助的小哈.此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈.那么,问题来了... 二.问题的分析 首先我们用一个二维数组来存储这个迷宫,刚开始的时候,小哼处于迷宫的入口处(1,1),小哈在(p,q).其实这道题的的本质就在于找从(1,1)到(p,q)的最短路径. 此时摆在小哼面前的路有两条,我们可以先让小哼往右边走,直到走不通的时候再回到这里,再去尝试另外一个方向. 在这里我们规定一

【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依次更新这log位,如果最高位依然有进位,那么找到最高位后面的第一个0,将中间的所有1变成0,那个0变成1.这个显然要用到线段树,但是复杂度是nlog2n的,肯定过不去. 于是我在考场上yy了一下,这log位是连续的,我们每次都要花费log的时间去修改一个岂不是很浪费?我们可以先在线段树上找到这段区间

uva1103(dfs)

UVA - 1103 还是没写好,,看的别人的 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #include <algorithm> 6 #include <cstdlib> 7 #include <stack> 8 #include <cctype> 9 #include <str

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

蓝桥杯 大臣的旅费_树的最长度_两次DFS

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <functional> #include <vector> using namespace std; const int maxn = 1000000 + 10; const int INF = 10000000

A. The Fault in Our Cubes 暴力dfs

http://codeforces.com/gym/101257/problem/A 把它固定在(0,0, 0)到(2, 2, 2)上,每次都暴力dfs检查,不会超时的,因为规定在这个空间上,一不行,就会早早退出. 这样写起来比较好写. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <

codeforces717E Paint it really, really dark gray(树上dfs)

题意: 给你一棵树,2e5个节点,每个节点有一种颜色(黑色或粉色) 让你从节点1开始,自由沿边行走,到达节点时会把这个节点的颜色改变 要求你输出任意一条路径使得从节点1出发,所有节点的颜色都变为黑色 思路: 很明显要递归遍历 每到达一个节点就先改变节点的颜色标志并输出当前节点 如果当前到达了叶子节点,则不用进行操作 返回上层节点时再改变节点的颜色标志并输出当前节点,然后判断叶子节点的颜色,如果为粉色,则再到达一次叶子节点再回到当前节点 这样确保当前节点的所有儿子节点都为黑色的 然后就这样一直递归

POJ2488 dfs

A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 41972   Accepted: 14286 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey ar

BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计数有一个什么什么算法... 我真的企图研究了...但是智商捉急的我实在看不懂论文... 所以最后还是写了暴力... 当然暴力也要靠正确的姿势的. 首先来看一个结论: 同一张图的所有最小生成树中,边权值相同的边的数目是一定的. 也就是说,假如某一张图的某一棵最小生成树由边权值为1,1,2,2,2,3的