[ CodeVS冲杯之路 ] P1116

  不充钱,你怎么AC?

  题目:http://codevs.cn/problem/1116/

  数据很小,DFS可A,每层枚举颜色,判断相邻的点是否有重复的颜色,记得回溯时把颜色染回0,即无颜色

  这里我使用了一个优化,在读入的时候将相邻的点压入数组,这样在判断的时候时间就小于O(n)

  不过这个优化好像没有不回溯的方法好,然而并没有写不回溯的

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8
 9 const int N=10;
10 int a[N],f[N][N],n,ans;
11 void dfs(int x)
12 {
13     if (x>n)
14         {
15             ans++;
16             return;
17         }
18     int i,j;
19     for (i=1;i<=4;i++)
20         {
21             for (j=1;j<=f[x][0];j++) if (a[f[x][j]]==i) break;
22             if (j<=f[x][0]) continue;
23             a[x]=i;
24             dfs(x+1);
25             a[x]=0;
26         }
27 }
28 int main()
29 {
30     int i,x,j;
31     scanf("%d",&n);
32     for (i=1;i<=n;i++)
33         for (j=1;j<=n;j++)
34             {
35                 scanf("%d",&x);
36                 if (x) f[i][++f[i][0]]=j;
37             }
38     dfs(1);
39     printf("%d\n",ans);
40     return 0;
41 }
时间: 2024-08-28 17:32:01

[ CodeVS冲杯之路 ] P1116的相关文章

[ CodeVS冲杯之路 ] P2492

不充钱,你怎么AC? 题目:http://codevs.cn/problem/2492/ 在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF) 对于查询操作,直接树状数组(以下简称BIT)维护,修改操作就一个个暴力开方搞,再用差值单点更新BIT 不过这样会TLE,要加一点优化对不对,正如开头所说的路径压缩链表 路径压缩链表其实就是个并查集,在普通的链表里,删去两个连续的节点后会是下面这种情况,如删去2,3 当访问 2 的时候,会跳到3,但 3 已经删除了,

[ CodeVS冲杯之路 ] P1368

不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/5853381.html 这边博客讲得很好啊,虽然不是这道题,但是方法是完全类似的 你把田忌赛马看懂了,泡泡堂就自然解出来了 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<c

[ CodeVS冲杯之路 ] P1169

不充钱,你怎么AC? 题目:http://codevs.cn/problem/1169/ 感觉这题目好恐怖,莫名其妙乱码一堆就AC了…… 它看上去是两个子问题,实际上可以看成从起点找两条不相交的路径使得经过的数和最大 用 f[i][j][k][l] 表示第一条走到了 (i,j) 第二条走到了 (k,l) 目标状态是 f[n][m-1][n-1][m] 一开始我也没仔细去想,就莫名其妙码了一堆交上去了,本以为会WA,结果A了?! 后面我仔细证明了一下,它是这样的 首先 l 是从 j+1 开始的,这

[ CodeVS冲杯之路 ] P3955

不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好啊,交给他吧 http://www.cnblogs.com/Booble/archive/2010/11/27/1889482.html 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #includ

[ CodeVS冲杯之路 ] P1197

不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密钥的映射,如果小于 a 或 A 则再将它加上 26 即可 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream>

[ CodeVS冲杯之路 ] P1294

不充钱,你怎么AC? 题目:http://codevs.cn/problem/1294/ 随手一打就是这么漂亮的全排列,想当年我初一还是初二的时候,调了1个多小时才写出来(蒟蒻一枚) 直接DFS每次枚举当前数字,记得判断是否重复,取完后打上标记并保存当前位置的数,最后到n+1层时打出来 因为极限数据的方案比较多,所以可以加上输出优化,不过不加也不会TL 上面那个是加了读入优化的,快了将近3倍 1 #include<cstdio> 2 #include<cstdlib> 3 #inc

[ CodeVS冲杯之路 ] P2456

不充钱,你怎么AC? 题目:http://codevs.cn/problem/2456/ 用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木板和木材都是从小到大开始选,然后要保证剩余的木材最少 那么将木板和木材排序,对于每个木材,把能够分的小木板尽量分掉,如果遇到更大的木板则把最小的木板腾出来,然后在加上,这样保证剩余的木材最少 因为是上午写得这道题,思路可能不连贯了,代码应该描述的很清楚 虽然贪心在CodeVS上可以过,但是它是有数据

[ CodeVS冲杯之路 ] P3145

 不充钱,你怎么AC? 题目:http://codevs.cn/problem/3145/ 经典的汉诺塔问题 我们移动的时候,如果是最小的1号就可以直接移动,否则先将上面的x-1号先移动到借用塔上,然后将x号移动到目标塔,最后将借用塔上的x-1号移动到目标塔,每次移动都需要借用一个借用塔,此塔为不同于出发塔和目标塔的那一个,递归做即可 次数的话个人比较懒,直接输出2n-1,就不在移动的时候统计次数了 1 #include<cstdio> 2 #include<cstdlib> 3

[ CodeVS冲杯之路 ] P3143

 不充钱,你怎么AC? 题目:http://codevs.cn/problem/3143/ 大水题一道,只要会遍历,这里讲一下思路 先序遍历:先输出,然后左儿子,最后右儿子 中序遍历:先左儿子,再输出,最后右儿子 后序遍历:先左儿子,然后右儿子,最后输出 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream>