传送门:http://vjudge.net/contest/view.action?cid=49557#overview
G题:
#include <iostream>
#include <cstring>
#include <stack>
#include <cstdio>
#define N 10
using namespace std;
const int dx[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
const int dy[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
int vis[N][N], fa[N*N];
int m,n;
int dfs (int x, int y, int cnt);
void print (int End);
inline bool inbond (int x, int y)
{
return (0 <= x && x < n && 0 <= y && y < m);
}
/*void printvis()
{
for (int y=0; y<m; y++)
{
for (int x=0; x<n; x++)
printf ("%d ",vis[x][y]);
printf("\n");
}
printf ("\n");
}
*/
int main()
{
int T;
cin >> T;
for (int tt=1; tt<=T; tt++){
cin >> m >> n;
memset(vis, 0, sizeof(vis));
fa[0] = 0;
int temp = dfs (0, 0, 1);
printf("Scenario #%d:\n", tt);
if(temp == -1){
printf("impossible\n");
}
else print(temp);
printf("\n");
}
return 0;
}
int dfs (int x, int y, int cnt)
{
vis[x][y] = 1;
//printvis();
if (cnt == m*n) return (y * n + x);
for (int i=0; i<8; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if (inbond(nx, ny) && !vis[nx][ny]){
//cout << 1111<<endl;
fa[ny*n+nx] = y * n + x;
int temp = dfs(nx, ny, cnt+1);
if( temp > -1){
return temp;
}
vis[nx][ny] = 0; //①
}
}
return -1;
}
void print (int End)
{
stack<int> dir;
dir.push(End);
int a = End, b; //②
while (1){
b = fa[a];
if (a == b) break;
dir.push(b);
a = b;
}
int temp, x, y;
while (!dir.empty()){
temp = dir.top();
dir.pop();
y = temp / n;
x = temp % n;
printf ("%c%d", x+'A', y+1);
}
printf("\n");
}
第一次写深搜,遇到几个问题:
①:这里进行一次深搜之后,忘了吧vis[][]数组置0,
②:刚开始写的是 a = fa[End], 导致最后打印出来的路径少了倒数第二条。
H题:
一次过了,就不贴代码了,不过在本地调试的时候有个小问题,是手残,在if语句后面直接跟了个分号导致的。
I题:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;
int t, n, sum;
int flag;
int ln = 0;
int orgin[15];
int num[15], times[15];
int used[15];
inline bool cmp(int a, int b)
{
return (a > b);
}
void dfs(int n);
void print();
int main()
{
while (cin >> t >> n && n){
for (int i=0; i<n; i++)
scanf ("%d", &orgin[i]);
sort(orgin, orgin+n, cmp);
memset(num, 0, sizeof(num));
memset(times, 0, sizeof(times)); //①
int j = 0;
for (int i=0; i<n;){
num[j] = orgin[i];
while (orgin[i] == num[j]){
times[j] ++;
i++;
}
j++;
}
ln = j;
/*
for (int i=0; i<ln; i++) printf ("%d ",num[i]);
printf ("\n");
for (int i=0; i<ln; i++) printf ("%d ",times[i]);
printf ("\n");
*/
flag = sum = 0;
memset(used, 0, sizeof(used));
printf("Sums of %d:\n", t);
dfs (0);
if (!flag) printf("NONE\n");
}
return 0;
}
void dfs(int n)
{
if(n >= ln) return ;
for (int i=times[n]; i>-1; i--){
sum += i * num[n];
used[n] = i;
if (sum == t && n == ln-1){ //②
print();
flag ++;
}
dfs(n+1);
sum -= i * num[n];
}
}
void print()
{
/*
for (int i=0; i<ln; i++) cout <<used[i]<<" ";
cout <<endl;
*/
queue<int> q;
for (int i=0; i<ln; i++){
for (int j=0; j<used[i]; j++)
q.push(num[i]);
}
printf ("%d", q.front());
q.pop();
while (!q.empty()){
printf ("+%d", q.front());
q.pop();
}
printf ("\n");
}
虽然交上去一次就过了,但在本地调试的时候出了几个问题,浪费好长时间,所以也贴出来了;
①:忘记初始化times[]数组(用来保存每一个数出现的次数),使得第二组之后的测试数据都出现错误;
②:没加n == ln判断条件,使同一种情况重复出现;
J题:
一次过了,在本地调试出了点问题,主要是这两天做棋盘太多了把行和列搞得乱七八糟的,还有就是直接复制的时候,有的地方忘记改动,代码就不贴了。
K题:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MaxN 11
using namespace std;
char grid [MaxN][MaxN];
int n,k;
int vis[MaxN];
int ans;
void dfs (int row, int col, int cnt);
int main()
{
while (cin >> n >> k && n > -1){
for (int i=0; i<n; i++)
scanf("%s", grid[i]);
ans = 0;
memset(vis, 0, sizeof (vis));
dfs(0, 0, 0);
printf ("%d\n",ans);
}
return 0;
}
void dfs (int row, int col, int cnt)
{
if (cnt == k){ans++; return ; }
for (int i=row; i<n+1-k+cnt; i++){
//cout << i <<endl;
for (int j=0; j<n; j++){ //①
if(grid[i][j] == '#' && !vis[j]){
vis[j] = 1;
dfs(i+1, j, cnt + 1);
vis[j] = 0;
}
}
}
}
这道题是交的最没底气的一道题,我自己都不太清楚为什么这样写。
调试的时候有一个错误①:把j的取值范围写成跟i一样了。代码先存着,以后可能还要再看